c++ 进一步理解declval函数

9rbhqvlz  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(153)

我刚刚学习了c++中的declval关键字,我想知道为什么在下面的代码中(std::add_rvalue_reference<Foo>::type).constFunc7() x = 3;不能编译。这不是和decltype(declvalCustom<Foo>().constFunc7()) y = 3;的模板声明declvalCustom一样吗?

#include <iostream>
#include <utility>

using namespace std;

struct Foo
{
    int constFunc7() { return 7; }
};

template< class T >
typename std::add_rvalue_reference<T>::type declvalCustom();

std::add_rvalue_reference<Foo> helper();

int main()
{
    // decltype(helper().constFunc7()); // not working
    // (std::add_rvalue_reference<Foo>::type).constFunc7() x = 3; // not working
    decltype(declvalCustom<Foo>().constFunc7()) y = 3; // ok
    decltype(std::declval<Foo>().constFunc7()) z = 3; // ok
    return 0;
}
6ss1mwsb

6ss1mwsb1#

declval不是关键字。std::declval是一个函数模板,只能合法地出现在未求值的上下文中。您的declValCustom也是一个具有类似属性的函数模板。
std::add_rvalue_reference<Foo>::type是一个类型,而不是一个表达式,因此不能将其用作子表达式。

相关问题