【问题标题】:Weird GCC array initialization behavior奇怪的 GCC 数组初始化行为
【发布时间】:2014-06-24 05:24:17
【问题描述】:

我在看另一个问题时遇到了这段代码的变体(原始代码使用std::thread而不是std::vector,但语法相同):

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<double> vecs[10] = std::vector<double>(10, 1);
    for(auto& vec: vecs){
        std::copy(vec.begin(), vec.end(), std::ostream_iterator<double>(std::cout, " "));
        std::cout<<std::endl;
    }
    return 0;
}

这段代码不应该编译; std::vector&lt;double&gt; vecs[10] = std::vector&lt;double&gt;(10, 1); 不是有效的初始化语法,clang 用error: array initializer must be an initializer list 拒绝它。但是,GCC accepts it 似乎使用指定临时的副本初始化列表中的每个向量。

这是我从未听说过的一些 GCC 扩展(不知何故也设法幸存了-pedantic-errors)还是只是一个普通的错误?

【问题讨论】:

  • 我猜是语言标准的差异?
  • @JonathonReinhart 两者都处于 C++11 模式,并且 AFAIK 该语法在 C++ 中从未合法。
  • 这不是here提到的(2)填充构造函数吗? 编辑:啊,没关系,错过了变量声明中的数组。
  • @JonathonReinhart 是的,这是一个有效的构造函数,问题是尝试使用它来初始化数组。那不应该编译。
  • 最小示例:struct a {a();} x[2] = a();。 gcc 编译它。没有构造函数声明,它不会。显然是一个错误。

标签: c++ gcc


【解决方案1】:

我认为这是一个错误。

#include <vector>

int main()
{
  std::vector<double> x = std::vector<double>(10, 1);
  std::vector<double> vecs[10] = x;
  return 0;
}

有效(如您所见)。

虽然

int main()
{
  int x = 10;
  int is[10] = x;
  return 0;
}

产生(预期的)错误。

【讨论】:

    【解决方案2】:

    进一步调查:

    struct A { A() { } };
    int main() { A a[10] = A(); }
    

    这在 GCC 中编译。

    struct A { A() = default; };
    int main() { A a[10] = A(); }
    

    也在 GCC 4.9 中编译,但不是我测试的早期版本 (4.6-4.8)。

    struct A { };
    int main() { A a[10] = A(); }
    

    不编译。

    struct B { virtual ~B() { } };
    struct A : B { };
    int main() { A a[10] = A(); }
    

    编译。

    struct B {  ~B() { } };
    struct A : B { };
    int main() { A a[10] = A(); }
    

    不编译。

    我认为可以肯定地说这是一个错误。没有理智的扩展会有这种行为。请注意,在第二种情况和第三种情况下,A 都是 POD 类型(唯一的区别是显式默认的默认构造函数),但 GCC 4.9 对它们的处理方式不同。

    编辑:再次通过 GCC bugzilla,this bug report 似乎是相关的。看起来我第一次错过了它,因为标题是在谈论字符串文字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多