2

次のコードを CLANG でコンパイルすると:

#include <iostream>
#include <array>
#include <algorithm>
#include <functional>

int main() {
  std::array<int, 2> a = {1, 2};
  std::array<int, 2> b = {2, 1};
  std::array<int, 2> c;
  std::transform(a.begin(), a.end(), b.begin(), c.begin(), std::multiplies<int>());
  for(auto &&i : c) std::cout << i << " ";
  std::cout << std::endl;
}

次のコマンドを発行します。

clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp

次の警告が表示されます。

警告: サブオブジェクトの初期化を囲む中括弧を提案します [-Wmissing-braces]

クランデモ

ただし、GCC はこのプログラムをコンパイルしても、警告はまったく出されません。

GCC デモ

Q:

  1. どのコンパイラが正しいですか?
  2. Clangs が警告する理由は何ですか?
4

2 に答える 2

0

どのコンパイラが正しいですか?

どちらのコンパイラも正しいです。ブレース省略は、1 組の中括弧で集約を初期化できるようにする機能です。各メンバー サブオブジェクトは、必要な数の初期化句で初期化されます。これは、より便利な形式の初期化を可能にするためです。

Clangs が警告する理由は何ですか?

Clang は、中かっこを省略できても、注意しないと集約がどのように初期化されるかが常に明確ではないため、警告することで役に立ちます。どの初期化句がどのメンバ サブオブジェクトに関連するかを確認する必要があります。

于 2015-06-20T23:57:42.590 に答える