0
template<class IntT, IntT low = IntT(), IntT high = IntT()>
struct X 
{
    static_assert(std::is_same<decltype(low),decltype(high)>::value,"Different types not allowed");//this should give error if types are different
    decltype(low) a;
    decltype(high) b;
    X():a(decltype(a)()),b(decltype(b)())//WHY THIS DOES NOT COMPILE?
    {
        cout << typeid(a).name() << '\n';
        cout << typeid(b).name() << '\n';
    }
};

int _tmain(int argc, _TCHAR* argv[])
{


    X<char,1,'a'> x;//this according to static_assert shouldn't compile but it does

    return 0;
}

VS2010を使用。
上記のコードの 3 つのコメントを参照してください。

4

3 に答える 3

4

最初に注意すべきことは、VS2010は古く、リリースされた日に壊れていたことです。decltypeキーワードは特に問題があり、最も基本的な使用法でのみ機能します。実際、それは多くの基本的なことをかなり間違っています。

次のコード...

template<class IntT, IntT low = IntT(), IntT high = IntT()>
struct X 
{
    static_assert(std::is_same<decltype(low),decltype(high)>::value,"Different types not allowed");//this should give error if types are different

しかし、彼らは決してそうなることはありません。

    decltype(low) a;
    decltype(high) b;

ここではdecltypeは必要ありません。タイプはIntTです。

    X():a(decltype(a)()),b(decltype(b)())//WHY THIS DOES NOT COMPILE?

VS2010は壊れており、通常、decltype式を型の場所のように使用することはできません。手前のtypedefの方がうまくいくかもしれません。

幸い、コピーではなくデフォルトのコンストラクターを使用できるため、これは必要ありません。

int _tmain(int argc, _TCHAR* argv[])
{


    X<char,1,'a'> x;//this according to static_assert shouldn't compile but it does

いいえ。static_assertはタイプが同じかどうかをチェックします。どちらもchar1と「a」です。

    return 0;
}

2番目と3番目のパラメーターのタイプが、渡された値の解決されたタイプに基づくように、テンプレートを作成しようとしているように見えます。これはできません。

于 2011-02-22T07:38:42.910 に答える
3

テンプレートパラメータlowおよびhighのdecltypeがcha​​rであるため、static_assertはコンパイルされます。テンプレート定義とインスタンス化を確認してください。IntT <-char

メンバーをデフォルトで初期化するには、次のように記述できます。

X():a(),b()
{
于 2011-02-22T07:27:12.470 に答える
1
X():a(decltype(a)()),b(decltype(b)())//WHY THIS DOES NOT COMPILE?

GCCはそれをうまくコンパイルします。これを参照してください: http://www.ideone.com/DG7rt

MSVC++10 コンパイラのバグのようです!

于 2011-02-22T07:23:05.700 に答える