gpt4 book ai didi

c++ - C++十进制类型和括号-为什么?

转载 作者:行者123 更新时间:2023-12-01 08:38:07 26 4
gpt4 key购买 nike

主题是discussed before,但这不是重复的。

当有人问decltype(a)decltype((a))之间的区别时,通常的回答是-a是变量,(a)是表达式。我觉得这个答案不令人满意。

首先,a也是一个表达式。 primary expression的选项包括-

  • (表达式)
  • id表达式

  • 更重要的是,decltype considers parentheses very, very explicitly的表述:
    For an expression e, the type denoted by decltype(e) is defined as follows:
    (1.1) if e is an unparenthesized id-expression naming a structured binding, ...
    (1.2) otherwise, if e is an unparenthesized id-expression naming a non-type template-parameter, ...
    (1.3) otherwise, if e is an unparenthesized id-expression or an unparenthesized class member access, ...
    (1.4) otherwise, ...

    因此问题仍然存在。为什么括号要区别对待?是否有人熟悉其背后的技术论文或委员会讨论?括号的明确考虑导致认为这不是疏忽,所以一定有我所缺少的技术原因。

    最佳答案

    这不是疏忽。有趣的是,在 Decltype和auto(修订版4)(N1705 = 04-0145)中有一个语句:

    The decltype rules now explicitly state that decltype((e)) == decltype(e)(as suggested by EWG).



    但是在 Decltype(修订版6)中:建议的措词(N2115 = 06-018)的更改之一是

    Parenthesized-expression inside decltype is not considered to be an id-expression.



    措词没有任何依据,但是我想这是使用稍微不同的语法对decltype的一种扩展,换句话说,它旨在区分这些情况。

    其用法在C++ draft9.2.8.4中显示:
    const int&& foo();
    int i;
    struct A { double x; };
    const A* a = new A();
    decltype(foo()) x1 = 17; // type is const int&&
    decltype(i) x2; // type is int
    decltype(a->x) x3; // type is double
    decltype((a->x)) x4 = x3; // type is const double&

    真正有趣的是它如何与 return语句一起工作:
    decltype(auto) f()
    {
    int i{ 0 };
    return (i);
    }

    我的Visual Studio 2019建议我删除多余的括号,但实际上它们变成了 decltype((i)),它将返回值更改为 int&,这使它自返回对局部变量的引用后变为UB。

    关于c++ - C++十进制类型和括号-为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60375448/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com