代码之家  ›  专栏  ›  技术社区  ›  pooya13

声明的C++顺序(在多变量声明行中)

  •  7
  • pooya13  · 技术社区  · 5 年前

    我在C++代码中使用下面的代码:

    int a = 0, b = a;
    

    我想知道这种行为是否可靠并且定义良好(从左到右的名称声明顺序),并且我的代码不会与其他编译器破坏 未申报名称 错误。

    如果不可靠,我会打破这一说法:

    int a = 0; 
    int b = a;
    

    谢谢您。

    3 回复  |  直到 5 年前
        1
  •  4
  •   Shafik Yaghmour    5 年前

    我相信答案是否定的。

    它受 core active issue 1342 上面写着:

    不清楚现有规范中的什么(如果有的话)要求按照声明顺序在单个声明中初始化多个in it声明符。

    我们在 [dcl.decl]p3 上面写着:

    注:一个有几个声明者的声明通常是 相当于相应的声明序列,每个声明序列 单个声明符。那就是

    T D1, D2, ... Dn;
    

    通常等于

    T D1; T D2; ... T Dn;
    

    但它是非规范性的,根本不涉及初始化的情况,据我所知,任何规范性的措词都不会说同样的话。

    尽管该标准确实涵盖了 [basic.scope.pdecl]p1 上面写着:

    名称的声明点在名称完成后立即出现 声明符及其初始值设定项(如果有的话)之前,除非如下所述。 [举例]:

    unsigned char x = 12;
    { unsigned char x = x; }
    

    在这里,第二个x是用它自己的(不确定的)值初始化的。 __结束示例__]

        2
  •  3
  •   JaMiT    5 年前

    你想问这个问题的事实表明这种风格并不好。即使单行版本是 几乎可以保证 阿西 为了工作,为了让读者更清晰地阅读,我仍然会采用两条线的方法。


    阿西 我最初说这是有保证的,但我会退后一步。在审阅了规范的相关部分之后,我可以看到语言律师如何抱怨没有明确说明此保证。(正如Shafik Yaghmour指出的, core active issue 1342 注意到缺乏明确的担保,尽管措辞表明应提供此类担保。)

    不过,我只会退回到“几乎可以保证”的地步,这是由 Each init-declarator in a declaration is analyzed separately as if it was in a declaration by itself. “。也就是说,分析 int a = 0, b = a; 有两个部分:一个是名为 a 初始化为 0 ,其中一个变量名为 b 初始化为的值 .如果你真的把这些部分分开,那么第一部分必须在第二部分开始之前完成(否则,它们就不象每个部分都是在一个声明中本身),所以 会有价值的 之前 已初始化。我承认这对于语言律师来说可能不够明确,但是如果有一个编译器的代码行不能按预期工作,那么对于编译器的bug报告来说就足够了。

    我很抱歉没有早点查到规格。当我最初回答时,“语言律师”标签不存在。

        3
  •  0
  •   Julien Villemure-Fréchette    5 年前

    定义由逗号分隔的多个变量的声明语句与以相同顺序定义单个变量的多个声明语句完全等效,因为变量的作用域在其名称之后开始,但至少有 两个例外 :

    1)当变量声明 隐藏一种类型 名称相同,如:

    struct S {};
    S S, T;
    

    不同于

    struct S {};
    S S;
    S T; //error: S is a variable name
    

    但是

    struct S {};
    S S, T{S};
    

    等于

    struct S{};
    S S;
    struct S T{S};
    

    2)当使用 auto decltype(auto) 说明符:

    auto i{0}, j{i}, k{2.0}; // error: deduction for auto fails, double or int?
    

    不同于

    auto i{0};
    auto j{i};
    auto k{2.0};
    

    在任何情况下,评估顺序总是从左到右。