std :: declval <T>()如何工作?

vso*_*tco 29 c++ c++11

我试图了解它是如何std::declval<T>()工作的.我知道如何使用它,并知道它的作用,主要是允许你在decltype不构造对象的情况下使用,比如

decltype(std::declval<Foo>().some_func()) my_type; // no construction of Foo
Run Code Online (Sandbox Code Playgroud)

我从cppreference.com知道std::declval<Foo>"添加"一个右值引用Foo,由于引用,折叠规则最终成为右值引用或左值引用.我的问题是为什么Foo没有调用构造函数?如何在std::declval<T>不构建模板参数的情况下实现"玩具"版本?

PS:我知道它与旧技巧不一样

(*(T*)(nullptr))
Run Code Online (Sandbox Code Playgroud)

Che*_*Alf 22

基本上,在一个sizeofdecltype表达式中,您可以调用未在任何地方实现的函数(它们需要声明,而不是实现).

例如

class Silly { private: Silly( Silly const& ) = delete; };

auto foo() -> Silly&&;

auto main() -> int
{
    sizeof( foo() );
}
Run Code Online (Sandbox Code Playgroud)

链接器不应该抱怨这一点.

  • @vsoft在未评估的环境中,重要的是类型.您不需要实例来使用实例:您只需要假装.毕竟,如果有两条小跑道,一只手落在森林里的声音是什么? (5认同)
  • @Wormer,我晚了一年,但是[this](/sf/answers/1421234531/)可能会回答为什么在`declval()`中使用右值引用。 (3认同)