当我查看代码片段以获得std :: common_type的可能实现时
template <class ...T> struct common_type;
template <class T>
struct common_type<T> {
typedef decay_t<T> type;
};
template <class T, class U>
struct common_type<T, U> {
typedef decay_t<decltype(true ? declval<T>() : declval<U>())> type;
};
template <class T, class U, class... V>
struct common_type<T, U, V...> {
typedef common_type_t<common_type_t<T, U>, V...> type;
};
Run Code Online (Sandbox Code Playgroud)
如何获得两个模板参数的公共类型的部分让我感到困惑.它是使用decltype的三元运算符.
众所周知,是否返回第二个或第三个操作数取决于第一个操作数的值.在这个片段中,第一个操作数为true,这意味着表达式的返回值将始终为declval<T>()
.如果这是我认为没有意义的...因此,我尝试了以下测试
int iii = 2;
float fff = 3.3;
std::cout << typeid(decltype(false? std::move(iii):std::move(fff))).name() << std::endl;
std::cout << typeid(decltype(std::move(iii))).name() << std::endl;
std::cout << typeid(decltype(false ? iii : fff)).name() << std::endl;
std::cout << typeid(decltype(true ? iii : fff)).name() << std::endl;
// [02:23:37][ryu@C++_test]$ g++ -std=c++14 -g common_type.cpp
// output
// f
// i
// f
// f
Run Code Online (Sandbox Code Playgroud)
与运行结果相比,结果我应该如下所示
int iii = 2;
float fff = 3.3;
std::cout << typeid(decltype(false ? iii : fff)).name() << std::endl; // should return f;
std::cout << typeid(decltype(true ? iii : fff)).name() << std::endl; // should return i;
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助解释为什么跑步结果不同?
换句话说,当它应用于三元表达式时,decltype的返回结果是什么?
归档时间: |
|
查看次数: |
665 次 |
最近记录: |