Return 应用于三元 (?:) 表达式时的 decltype 类型
Return type of decltype when applied to ternary(?:) expression
当我查看可能实现 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;
};
如何为两个模板参数获取通用类型的部分让我很感兴趣 confused.It 是三元运算符与 decltype 的用法。
据我所知,是否return第二个或第三个操作数是由第一个操作数的值决定的。在此代码段中,第一个操作数是 true,这意味着表达式的 return 值将始终是 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
对比运行的结果,我觉得应该是这样的结果
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;
谁能帮忙解释一下为什么 运行 结果不同?
换句话说,decltype 应用于三元表达式时的 return 结果是什么?
表达式的类型是编译时 属性。条件表达式中第一个操作数的值(以及因此选择的分支)通常是 运行-time 的东西,所以它不可能影响表达式的类型。
而是用一套复杂的规则(超过一页标准语,大部分我在this answer中引用)来确定第二个和第三个操作数的"common type"是什么, 并且条件表达式属于该类型。 std::common_type
仅利用核心语言中的现有规则。
当我查看可能实现 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;
};
如何为两个模板参数获取通用类型的部分让我很感兴趣 confused.It 是三元运算符与 decltype 的用法。
据我所知,是否return第二个或第三个操作数是由第一个操作数的值决定的。在此代码段中,第一个操作数是 true,这意味着表达式的 return 值将始终是 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
对比运行的结果,我觉得应该是这样的结果
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;
谁能帮忙解释一下为什么 运行 结果不同?
换句话说,decltype 应用于三元表达式时的 return 结果是什么?
表达式的类型是编译时 属性。条件表达式中第一个操作数的值(以及因此选择的分支)通常是 运行-time 的东西,所以它不可能影响表达式的类型。
而是用一套复杂的规则(超过一页标准语,大部分我在this answer中引用)来确定第二个和第三个操作数的"common type"是什么, 并且条件表达式属于该类型。 std::common_type
仅利用核心语言中的现有规则。