3

std::vector の fill コンストラクター (いずれかの形式) を C++11 のクラス メンバー初期化機能と共に使用すると、次のコードはコンパイルに失敗します (clang/llvm 3.6 で):

#include <vector>

class Foo
{
  std::vector<char> buf_(10); //compiler error!
  std::vector<std::vector<char>> buf2_(10, std::vector<char>(20)); //compiler error!

public:
  void Bar();
};

void Foo::Bar()
{
  std::vector<char> buf3_(10); //OK
  std::vector<std::vector<char>> buf4_(10, std::vector<char>(20));  //OK
}

ベクトル塗りつぶしコンストラクターとクラス メンバーの初期化に関する問題を検索しましたが、何も見つかりませんでした。私は何が欠けているのですか?

4

2 に答える 2

7

非静的データ メンバーのインプレース初期化は、その構文を使用して許可されていません。フォームが必要です

T t{args}; // 1

また

T = t{args}; // 2

また

T = t(args); // 3

その理由は、関数宣言のように見えるものを避けるためです。

また、初期化リスト コンストラクターが優先されるため、 for std::vectorformは驚くべき動作を引き起こす可能性があることに注意してください。1そう

std::vector<int> v{1,2}; // two elements: 1 and 2

と同じではありません

std::vector<int> v = std::vector<int>(1, 2); // 1 element: 2
于 2015-07-27T22:12:21.617 に答える
2

私は何が欠けているのですか?

有効な構文? これが有効だった場所をどこで読んだかわからない。

カーリーを使用するか、次のようにし=ます。

struct Foo
{
  std::vector<char> buf_ = std::vector<char>(10);
  std::vector<std::vector<char>> buf2_{10, std::vector<char>(20)};
};

関連する文法生成は、その名前に手がかりを保持するブレースまたはイコール初期化子です。:)

于 2015-07-27T22:13:28.537 に答える