【发布时间】:2016-08-18 22:15:49
【问题描述】:
根据[5/8]和[7.1.7.2/4](工作草案):
-
decltype说明符的操作数是未计算的操作数 - 未计算的操作数未计算
考虑下面的代码:
#include<type_traits>
struct S { using type = int; };
int f(int i);
template<typename T>
typename T::type g(T);
template<typename T>
auto h(T v) { return v; }
int main() {
static_assert(std::is_same<decltype(f(42)), int>::value, "!");
static_assert(std::is_same<decltype(g(S{})), int>::value, "!");
static_assert(std::is_same<decltype(h(42)), int>::value, "!");
}
不用说,f 和 g 实际上并没有被评估。
另一方面,函数h 有一个auto 返回类型,它是从它的主体推导出来的,因此是从它的参数推导出来的,因此是从推导的类型T 推导出来的。
在这种情况下,它是否仍可被视为未计算的操作数?
我的意思是,在我看来,在 decltype 的上下文中,必须评估函数 h 才能知道实际的返回类型是什么。
因为我很确定工作草案是正确的,所以问题是:我的推理有什么问题?
【问题讨论】:
-
查看此问题的一种方法是:编译器是否需要知道
v的什么值才能从h(42)推断出T,或者只是v的类型?