我正在阅读有关限定名称查找的条款。引用来自:
如果嵌套名称说明符中的:: scope resolution运算符不是 前面是一个decltype-specifier,查找之前的名称:: 仅考虑其专业化的名称空间,类型和模板 是类型。
正如标准decltype-specifier
中所定义的那样:
decltype-specifier:
decltype ( expression )
decltype ( auto )
这是什么意思?你能解释一下这个关键词的用途吗?
答案 0 :(得分:11)
decltype
是C ++ 11引入的新关键字之一。 它是一个返回表达式类型的说明符。
在模板编程中,检索依赖于模板参数或返回类型的表达式类型特别有用。
中的示例struct A {
double x;
};
const A* a = new A{0};
decltype( a->x ) x3; // type of x3 is double (declared type)
decltype((a->x)) x4 = x3; // type of x4 is const double& (lvalue expression)
template <class T, class U>
auto add(T t, U u) -> decltype(t + u); // return type depends on template parameters
对于第二个说明符版本,在C ++ 14中允许它使一些繁琐的decltype
声明更容易阅读:
decltype(longAndComplexInitializingExpression) var = longAndComplexInitializingExpression; // C++11
decltype(auto) var = longAndComplexInitializingExpression; // C++14
修改强>
decltype
自然可以与范围运算符一起使用。
来自this existing post的示例:
struct Foo { static const int i = 9; };
Foo f;
int x = decltype(f)::i;
您对该标准的引用指定在这种情况下,查找decltype(f)
的名称不仅仅考虑其专业化类型的名称空间,类型和模板。这是因为在这种情况下,名称查找将转移到decltype
运算符本身。