Decltype和左值表达式
decltype and lvalue expression
根据http://en.cppreference.com/w/cpp/language/decltype
struct A {
double x;
};
const A* a = new A();
decltype( a->x ) x3;
匹配1个大小写,即:
如果实参是对象/函数的未加括号的名称,或者是成员访问表达式(object。成员或指针->成员),则decltype
指定该表达式指定的实体的声明类型。
但是这个注意:
如果一个对象的名字加上括号,它就变成了一个左值表达式
使我想到以下问题:如果a->x
不是左值表达式,它的类型是什么?
我甚至不明白为什么
decltype((a->x)) x4 = x3; // type of x4 is const double& (lvalue expression)
被评估为const&
只是因为它被认为是一个左值表达式,而不是真正看到链接。
使我想到以下问题:如果a->x不是左值表达式,它的类型是什么?
你只是糊涂了。
如果一个对象的名字加上括号,它就变成了一个左值表达式
应该是
如果对象的名称被括号括起来,则通过decltype对其进行不同的处理。
带括号和不带括号的内容都是左值表达式。如果不加括号,则decltype不检查表达式的类型,而是检查名称查找找到要引用的名称的声明所使用的类型(例如,如果名称查找将其解析为右值引用变量,则可能是int&&
,但表达式的类型是int
,并且是左值)。
思考这个问题的方法是(IMHO):
decltype( a->x )
保存/检索x
引用成员变量的信息,因此它为您提供了成员变量的声明类型。这很有用,因为如果这将自动转换为下一个case,则无法提取该信息:
decltype( (a->x) )
这"只是"一个表达式,因此其行为与任何其他表达式一样。它指向表达式返回的,而不是表达式引用的。表达式是一个左值,它是不是成员变量并不重要。显式地丢弃了可用的部分信息,表示您不关心对象/成员声明为什么,而只关心表达式的结果类型。
换句话说:第一种语法给你更多的信息,除非你明确地决定你不需要它们而使用第二种语法。
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- C++decltype和圆括号-为什么
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- C++中的可视化 Decltype 表达式类型推导
- 如果我将 decltype 应用于产生右值的表达式,我是否总是得到一个指针?C++
- decltype(右值表达式)的类型推导规则是什么
- do decltype 需要一个涉及完整类型的表达式
- 如何绕过在 decltype 表达式中指定变量
- 为什么返回类型中的decltype表达式必须在符号名称中损坏
- 通过"using"表达式缩短 std::remove_const(decltype(something))
- 对哪些表达式应用decltype后产生引用类型?< / h1 >
- 是否执行decltype内的表达式,或者只是检查是否验证
- Decltype和左值表达式