【问题标题】:Why cannot form reference to 'decltype(auto)'为什么不能形成对'decltype(auto)'的引用
【发布时间】:2015-03-02 05:27:53
【问题描述】:
int main(){
    decltype(auto)&& a = 100;
}

以上代码,GCC和Clang中的错误。

int main(){
    decltype(int)&& a = 100;
}

此代码正确。

在 N4296 中,

在第 8.3.2/6 节中

如果 typedef (7.1.3)、类型模板参数 (14.3.1) 或 decltype-specifier (7.1.6.2) 表示类型 TR 这是对类型 T 的引用,尝试创建类型“对 cv TR 的左值引用”会创建类型 “对 T 的左值引用”,而尝试创建类型“对 cv TR 的右值引用”会创建类型 TR。

decltype-specifier in § 7.1.6.2

decltype-specifier:
decltype ( 表达式 )
decltype ( 自动 )

我认为 § 8.3.2/6 的措辞有问题。

为什么不允许引用 decltype(auto)。 请告诉我相关标准的措辞。 抱歉英语不好。 谢谢。

【问题讨论】:

    标签: c++ c++14 decltype


    【解决方案1】:

    在 § 7.1.6.4 [dcl.spec.auto]

    如果占位符是 decltype(auto) 类型说明符,则声明的 变量的类型或函数的返回类型应为 仅占位符。为变量或返回类型推导的类型是 如 7.1.6.2 中所述确定,就好像初始化器已经 decltype 的操作数。

    所以这是允许的:

    decltype(auto) a = 100;
    

    但不是这个:

    decltype(auto)& a = 100;
    

    或者这个:

    decltype(auto)&& a = 100;
    

    这是有道理的,因为 decltype(auto) 背后的一个想法是在类型推导期间保持引用性(即使用 decltype 类型推导,而不是模板/自动类型推导)


    该标准为我们提供了 decltype(auto) 如何推断引用的示例:

    int i;
    int&& f();
    auto x3a = i;                  // decltype(x3a) is int
    decltype(auto) x3d = i;        // decltype(x3d) is int
    auto x4a = (i);                // decltype(x4a) is int
    decltype(auto) x4d = (i);      // decltype(x4d) is int&
    auto x5a = f();                // decltype(x5a) is int
    decltype(auto) x5d = f();      // decltype(x5d) is int&&
    auto x6a = { 1, 2 };           // decltype(x6a) is std::initializer_list<int>
    decltype(auto) x6d = { 1, 2 }; // error, { 1, 2 } is not an expression
    auto *x7a = &i;                // decltype(x7a) is int*
    decltype(auto)*x7d = &i;       // error, declared type is not plain decltype(auto)
    

    【讨论】:

    • 谢谢。 §8.3.2/6 令人困惑。
    猜你喜欢
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2021-11-18
    • 2017-03-18
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多