48

派生は、C++11の統一初期化構文を使用して基本クラスコンストラクターを呼び出すことに注意してください。

class base
{
    protected:
        base()
        {}
};

class derived : public base
{
    public:
        derived()
            : base{} // <-- Note the c++11 curly brace syntax
                     // using uniform initialization. Change the
                     // braces to () and it works.
        {}
};

int main()
{
    derived d1;

    return 0;
}

g ++ 4.6はこれをコンパイルしますが、g++4.7はコンパイルしません。

$ g++-4.7 -std=c++11 -Wall -Wextra -pedantic curly.cpp -o curly
curly.cpp: In constructor ‘derived::derived()’:
curly.cpp:4:13: error: ‘base::base()’ is protected
curly.cpp:19:24: error: within this context

どうしたの?

アップデート1:clang ++-3.1で警告なしにコンパイルされます
アップデート2:確かにコンパイラのバグのようです。明らかにGCC4.7.3で修正されています。

4

4 に答える 4

4

GCC / libstdc++の寄稿者であるPaoloCarliniは、それがバグ/リグレッションであることを確認しました

于 2012-10-17T22:52:10.573 に答える
-1

私はこれを見つけました:

「ドラフトによると、参照を初期化する初期化リストは、直接バインドではなく、最初に初期化リストの要素から一時的なものを作成し、次にターゲット参照をその一時的なものにバインドすることによって行われます。」

したがって、base {}によって作成された一時的なものが、保護されたコンストラクターを介して実行されているという事実に窒息している可能性があります。

于 2012-09-21T16:47:52.003 に答える
-1

これをicpc(バージョン11.1-> 12.1でテストされたIntelコンパイラ)でコンパイルすると、次のようになります。

-bash-3.2$ icpc -std=c++0x test.c 
test.c(15): error: expected a declaration
          {}
          ^

test.c(12): error: expected a "("
              : base{} // <-- Note the c++11 curly brace syntax
                    ^

compilation aborted for test.c (code 2)

編集:しかし、繰り返しになりますが、c++11はまだicpcに完全には実装されていません http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/

g++と同じ http://gcc.gnu.org/gcc-4.7/cxx0x_status.html

これはまだ実験的であると明確に述べているので、バグの可能性が非常に高いです。

于 2012-09-18T16:46:45.210 に答える
-1

これは、バージョン4.7C11で明示的なオーバーライド制御が追加されたことが原因である可能性があります。

于 2012-09-14T17:18:33.100 に答える