std::declval是一个编译时实用程序,用于构造表达式以确定其类型。它是这样定义的:templatetypenamestd::add_rvalue_reference::typedeclval()noexcept;这不是更简单吗?templateTdeclval()noexcept;引用返回类型有什么好处?而且不应该叫declref吗?我发现的最早的历史例子是n2958,它调用函数value()但已经总是返回一个引用。注意,decltype的操作数不需要具有可访问的析构函数,即它不作为完整表达式进行语义检查。templatetdeclprval()noexcept;classc{
我想了解std::declval()作品。我知道怎么用,也知道它的作用,主要是让你用decltype不构造对象,比如decltype(std::declval().some_func())my_type;//noconstructionofFoo我从cppreference.com知道那std::declval“添加”对Foo的右值引用,由于引用折叠规则最终成为右值引用或左值引用。我的问题是为什么Foo的构造函数不叫?如何实现std::declval的“玩具”版本?不构造模板参数?PS:Iknow和老套路不一样(*(T*)(nullptr)) 最佳答案
我想了解std::declval()作品。我知道怎么用,也知道它的作用,主要是让你用decltype不构造对象,比如decltype(std::declval().some_func())my_type;//noconstructionofFoo我从cppreference.com知道那std::declval“添加”对Foo的右值引用,由于引用折叠规则最终成为右值引用或左值引用。我的问题是为什么Foo的构造函数不叫?如何实现std::declval的“玩具”版本?不构造模板参数?PS:Iknow和老套路不一样(*(T*)(nullptr)) 最佳答案
将类型更改为类型的reference,允许访问该类型的成员而无需创建该类型的实例。lvaluereferences和rvaluereferences似乎都是如此。declval是用add_rvalue_reference而不是add_lvalue_reference实现的,这只是一个约定吗,或者有没有使用add_rvalue_reference更可取的例子?编辑:我想我有点含糊,这些答案都很好,但触及的点略有不同。建议使用两种不同的答案,Howard强调您可以选择您的类型所具有的引用,从而使add_rvalue_reference更加灵活。其他答案强调默认行为会自动选择更自然地反射(r
将类型更改为类型的reference,允许访问该类型的成员而无需创建该类型的实例。lvaluereferences和rvaluereferences似乎都是如此。declval是用add_rvalue_reference而不是add_lvalue_reference实现的,这只是一个约定吗,或者有没有使用add_rvalue_reference更可取的例子?编辑:我想我有点含糊,这些答案都很好,但触及的点略有不同。建议使用两种不同的答案,Howard强调您可以选择您的类型所具有的引用,从而使add_rvalue_reference更加灵活。其他答案强调默认行为会自动选择更自然地反射(r