3
#include <iostream>
using namespace std;

struct test
{
   int factorX;
   double coefficient;
};

int main()
{
   test firstTest = {1, 7.5}; //that's ok

   test *secondTest = new test;
   *secondTest = {8, 55.2}; // issue a compiler warning

}

コンパイラが次の警告を発行する理由がわかりません。

test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]

C ++ 11では代入演算子を省略できることは知っていますが、そうではありません。g++4.7.2を使用しています。

4

3 に答える 3

5

あなたのtest構造は集合体です。中括弧構文を使用した集計の初期化はC++98でサポートされていますが、代入はサポートされていません。

ここで実際に起こっていることは、コンパイラーが暗黙的に生成されたムーブ代入演算子を呼び出し、それをtest&&入力として受け取ることです。この呼び出しを合法にするために、コンパイラーは、そこから一時的なものを作成{8, 55.2}してのインスタンスに変換し、次にこの一時的なものからtestmove-assignする必要があります。*secondTest

この動作はC++11でのみサポートされているため、コンパイラはオプションを使用してコンパイルする必要があると通知し-std=c++11ます。

于 2013-03-20T12:56:46.873 に答える
2

1つ目は初期化で、2つ目は割り当てです。C ++ 98では、この方法で単純な構造体を初期化できますが、割り当てることはできません。

8.5.1 / 1

アグリゲートは、ユーザーが宣言したコンストラクター(12.1)、プライベートまたは保護された非静的データメンバー(11節)、基本クラス(10節)、仮想関数を含まない配列またはクラス(9節)です。 (10.3)。

8.5.1 / 2

アグリゲートが初期化されると、イニシャライザーには、アグリゲートのメンバーのイニシャライザー句のコンマ区切りのリストで構成されるイニシャライザー句を含めることができます。このリストは、添え字またはメンバーの昇順で記述されます。

ただし、クラスの2番目の構築呼び出しoperator =では、ユーザー定義のコピーc-torがないため、デフォルトのコピーc-torが呼び出されます。C++ 11では、式を使用し{}て必要なタイプのオブジェクトを構築できますが、C++では構築できません。 98。

于 2013-03-20T12:55:35.193 に答える
1

エラーメッセージは、プログラムをコンパイルするときにコマンドラインに追加-std=c++11または追加する必要があることを示しています。-std=gnu++11これはC++11の機能であり、有効にする必要があります。

 test2.cpp:13:33: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
                                                                           ^^^^^^^^^     ^^^^^^^^^^^

Andyが言っていたように、から作成された一時関数で暗黙的に生成された移動関数を使用するのはC ++ 11機能です{8, 55.2}。これは、2番目の場合にあります。

于 2013-03-20T12:55:45.583 に答える