gpt4 book ai didi

c++ - 为什么 std::declval 添加引用?

转载 作者:IT老高 更新时间:2023-10-28 14:02:12 30 4
gpt4 key购买 nike

std::declval是一个编译时实用程序,用于构造表达式以确定其类型。它是这样定义的:

template< class T >
typename std::add_rvalue_reference<T>::type declval() noexcept;

这不是更简单吗?

template< class T >
T declval() noexcept;

引用返回类型有什么好处?而且不应该叫declref吗?

我发现的最早的历史例子是n2958 ,它调用函数 value() 但已经总是返回一个引用。

注意,decltype 的操作数不需要具有可访问的析构函数,即它不作为完整表达式进行语义检查。

template< typename t >
t declprval() noexcept;

class c { ~ c (); };
decltype ( declprval< c >() ) * p = nullptr; // OK

最佳答案

只有当函数调用本身是 decltype 的操作数或右逗号运算符的操作数,它是 decltype 的操作数(§5.2.2 [expr.call]/p11),这意味着在 OP 中给定 declprval

template< typename t >
t declprval() noexcept;

class c { ~ c (); };

int f(c &&);

decltype(f(declprval<c>())) i; // error: inaccessible destructor

不编译。更一般地说,返回 T 会阻止大多数非平凡的使用带有不完整类型的 declval、带有私有(private)析构函数的类型等:

class D;

int f(D &&);

decltype(f(declprval<D>())) i2; // doesn't compile. D must be a complete type

这样做并没有什么好处,因为 xvalues 与 prvalues 几乎没有区别,除非您在它们上使用 decltype,而且您通常不会直接在declval 的返回值 - 你已经知道类型了。

关于c++ - 为什么 std::declval 添加引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25707441/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com