std::declval 不能被调用的语句是什么意思?
What is meant by the statement that std::declval cannot be called?
在 std::declval
的 cppreference-page 上,它表示如下:
Return value
Cannot be called and thus never returns a value.
这是什么意思?肯定是我们用的时候调用的吧?
struct Foo { int func(){} };
decltype(std::declval<Foo>().func()) integer;
/* ^
| */
如果 std::declval<T>
被 odr 使用,则程序格式错误。但是,cppreference 试图以大多数用户会觉得更容易理解的方式来表达这一点。
对函数的调用,或获取函数的地址,通常会 odr-use 该函数。但是,只有当 call/address 实际上 被评估 时才会出现这种情况。因此,只要不对调用求值,调用 std::declval<T>
就是合法的。 (请注意,仅仅证明调用永远不会在运行时发生是不够的。相反,调用必须发生在某些类型的上下文中,在这种情况下语言规则阻止它被评估。因此,编译器总是可以检查这个条件。)
decltype
不计算其操作数,因此在 decltype
中调用 std::declval<T>
通常是合法的。但是,在某些情况下,操作数的一部分仍然会被计算。例如,decltype(std::array<int, std::declval<int>()>)
不会编译,因为它会尝试计算 std::declval<int>()
以获得数组的大小。
在 std::declval
的 cppreference-page 上,它表示如下:
Return value
Cannot be called and thus never returns a value.
这是什么意思?肯定是我们用的时候调用的吧?
struct Foo { int func(){} };
decltype(std::declval<Foo>().func()) integer;
/* ^
| */
如果 std::declval<T>
被 odr 使用,则程序格式错误。但是,cppreference 试图以大多数用户会觉得更容易理解的方式来表达这一点。
对函数的调用,或获取函数的地址,通常会 odr-use 该函数。但是,只有当 call/address 实际上 被评估 时才会出现这种情况。因此,只要不对调用求值,调用 std::declval<T>
就是合法的。 (请注意,仅仅证明调用永远不会在运行时发生是不够的。相反,调用必须发生在某些类型的上下文中,在这种情况下语言规则阻止它被评估。因此,编译器总是可以检查这个条件。)
decltype
不计算其操作数,因此在 decltype
中调用 std::declval<T>
通常是合法的。但是,在某些情况下,操作数的一部分仍然会被计算。例如,decltype(std::array<int, std::declval<int>()>)
不会编译,因为它会尝试计算 std::declval<int>()
以获得数组的大小。