我想了解下面的分配如何int &與作品double一起declval作業?是否被T推斷為 以外的東西int &?
#include <iostream>
#include <type_traits>
#include <utility>
template <typename T, typename U, typename = void>
struct assignment : std::false_type{};
template <typename T, typename U>
struct assignment<T, U, std::void_t<decltype(std::declval<T>() = std::declval<U>())>> : std::true_type {};
int main() {
// int &x = 23.4; // does not compile since x is not a const ref
static_assert(assignment<int &, double>::value); // why is this OK?
}
uj5u.com熱心網友回復:
T 是否被推匯出為 以外的東西
int &?
T仍將推匯出為int&,因此std::declval<T>() = std::declval<U>()大致等價于
int& f();
double&& g();
f() = g(); // assignment
請注意,f() = g()它仍然是格式良好的,因為f()回傳對已創建int的可分配給 a的參考double。但是如果你這樣做int& f() { return 23.4; }了,那么你會得到一個編譯錯誤,因為非const左值參考不能被右值初始化。相反,您可以創建一個輔助函式,將T其作為引數型別
template <typename T, typename U, typename = void>
struct initialize : std::false_type{};
template<typename T>
void accepted(T);
template <typename T, typename U>
struct initialize<T, U,
std::void_t<decltype(accepted<T>(std::declval<U>()))>> : std::true_type {};
這將static_assert(initialize<int &, double>::value)失敗,因為int&無法進行右值初始化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/476405.html
上一篇:多型性產生奇怪的行為
