【问题标题】:c++11 decltype returns reference typec++11 decltype 返回引用类型
【发布时间】:2014-08-07 15:37:45
【问题描述】:

我有点困惑,为什么 decltype 与逗号运算符在某些情况下会返回引用类型。

例如,在这段代码中:

int i = 101;
decltype(1, i) var = i;
var = 20;
printf("%d\n", i); // will print 20

这里,var 是 int& 而不是 int,但是如果我将第二行替换为:

decltype(i) var = i;

它将返回 int!

谁能解释一下?

【问题讨论】:

    标签: c++ c++11 decltype


    【解决方案1】:

    decltype 是不带括号的 id-expression 的特例,用于给出实体的类型,没有引用限定[dcl.type.simple]

    4 - decltype(e) 表示的类型定义如下:
    — 如果e 是无括号的id 表达式或无括号的类成员访问(5.2.5),则decltype(e)e 命名的实体的类型。 [...]
    — 否则,如果e 是左值,则decltype(e)T&,其中Te 的类型; [...]

    通过提供逗号表达式,您可以禁用这种特殊情况,如括号:

    decltype(i)    // int
    decltype((i))  // int&
    decltype(1, i) // int&
    

    (i)1, i 是左值表达式,所以它们的decltype 是一个引用类型。

    【讨论】:

    • 为什么 1,i 是左值?
    • @Greycon 1,i 从左到右返回最后一个操作数的 lvalue 引用。
    • @Greycon 逗号表达式具有其 RHS 操作数的类型和值类别。 "结果的类型和值是右操作数的类型和值;结果与其右操作数属于同一值类别 [...]"
    • 好的,谢谢。那么,1,i 的类型就是 i 的类型,也就是 int?如果是这样,MSVC 编译器肯定会从 OP 正确打印 101。也就是说 decltype(1,i) 产生 int,而不是 int & - 我正确吗?
    • 啊,对不起,我刚刚重新阅读了您从标准中提取的内容,我现在明白了。感谢您的教育:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多