在cppreference-page上有std::declval以下内容:
返回值
无法调用,因此永远不会返回值。
这是什么意思?我们在使用的时候肯定会调用它吗?
struct Foo { int func(){} };
decltype(std::declval<Foo>().func()) integer;
/* ^
| */
Run Code Online (Sandbox Code Playgroud)
std::declval<T>如果使用 ODR ,则该程序格式错误。然而,cppreference 尝试以大多数用户更容易理解的方式来表达这一点。
对函数的调用或获取函数的地址通常会使用该函数。然而,只有在实际评估呼叫/地址时才是这种情况。std::declval<T>因此,只要调用未被评估,调用就是合法的。(请注意,仅仅证明该调用永远不会在运行时发生是不够的。相反,该调用必须发生在某些类型的上下文中,其中语言的规则阻止对其进行求值。因此,编译器始终可以检查这一点健康)状况。)
decltype不评估其操作数,因此调用std::declval<T>inside通常是合法的decltype。然而,在某些情况下,无论如何都会评估部分操作数。例如,decltype(std::array<int, std::declval<int>()>)不会编译,因为它将尝试进行计算std::declval<int>()以获得数组的大小。
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |