gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:08 29 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/58261569/

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