18

この例では:

template<class T>
struct S : T
{
    using T::X;
};

T::XXのメンバーを参照する従属名ですTS<T>でインスタンス化されている場合T = X:

struct X
{
    X(int) {}
};
...
S<X> s(42);

using 宣言は継承コンストラクタになりますか?

Clang はコードを拒否しますDEMOが、g++ はそれを受け入れます。

次のように書くと注意してください。

using T::X::X;

どちらのコンパイラもコードを受け入れ、継承コンストラクタとして扱います。using T::X標準で継承コンストラクターになることは許可されていますか?

4

1 に答える 1

4

これを指摘してくれた TC に感謝します。

Core issue 2070は、草案段階 (問題であることが確認されており、解決策の文言を作成中) であり、このケースを扱っています。提案された修正では、このコードを継承コンストラクターとして受け入れるために、両方の ID が同じ ID である必要があります。

この観点から、clang からのエラー メッセージは理にかなっています。T::X は型 X であり、「typename タグのないテンプレートからの型」エラーをトリガーするからです。

元の投稿:

したがって、本当の問題は、「テンプレートのインスタンス化によって using ステートメントのセマンティックな意味が変わることは許されるのか?」ということのように思えます。

そして答えは、それは許可されていないということです。この相互作用が標準の作成者によって予見され、意図されていたかどうかはわかりません。しかし、私が見る限り、セクション 10 の using 宣言とセクション 17 のテンプレートの初期化の両方を参照すると、標準の文字により、はい、using T::X許可されており、T が X の場合、using 宣言は継承コンストラクターになります。 .

于 2017-04-07T02:21:09.587 に答える