我看到了一些代码示例,其中用于实例化std::declval模板函数的类型被指定为引用类型,而不仅仅是一个类型,如下所示:
std::declval<T &>()与此相对的是:
std::declval<T>()其中T是某种类型。我错过了为什么引用符号可能会被选择而不是普通类型的微妙之处。有人能给我解释一下吗?
我知道std::declval扩展到了typename std::add_rvalue_reference<T>::type,但是我仍然不明白为什么要通过引用类型而不是普通类型本身来实例化后者。
发布于 2021-04-29 04:27:16
由于引用折叠,结果是不同的(见the answer I linked in a comment),它确实有后果。
例如,考虑到成员函数可以是&&/&/const&限定的。
下面是一个简单的示例,尽管可能没有意义,但它说明了如何将T与T&传递给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())>);
}https://stackoverflow.com/questions/67307362
复制相似问题