2

我看到一些代码示例,其中用于实例化std::declval模板函数的类型被指定为引用类型,而不仅仅是一个类型,如下所示:

std::declval<T &>()

相对于:

std::declval<T>()

T某种类型在哪里。我错过了为什么选择引用符号而不是普通类型的微妙之处。有人可以向我解释一下吗?

我知道这std::declval扩展为,typename std::add_rvalue_reference<T>::type但我仍然想念为什么人们会通过引用类型而不是普通类型本身来实例化后者的原因。

4

1 回答 1

3

由于参考折叠结果不同(请参阅我在评论中链接的答案),并且确实会产生后果。

&&例如,考虑一下成员函数可以是//限定的事实&const&

以下是一个简单的(尽管可能毫无意义)示例,说明传递TT&传递如何std::declval产生“剧烈”效果。

#include <type_traits>
struct A{};
struct B{};

struct C {
    A f() && { return A{}; }
    B f() const & { return B{}; }
};
int main() {
    static_assert(std::is_same_v<A, decltype(std::declval<C>().f())>);
    static_assert(std::is_same_v<B, decltype(std::declval<C&>().f())>);
}
于 2021-04-28T20:27:16.240 回答