11
struct X{};

template<class T>
decltype(X() == int()) f(T const&){ return true; }

int main(void) {
  X x;
  f(x);
}

なぜ、なぜどこoperator==にも定義されていません!

MS Connectの詳細なバグレポートを提供するために、ここで何が起こっているのかを本当に理解したいと思います。狂気への私の旅は、このあたりのラウンジ<C++>チャットルームで始まりました...

(注:GCCもClangもこのコードを受け入れません。)

ああ、ところで、プライベートX(int)ctorを追加すると、コンパイルが失敗します。

struct X{
    X(){}
private:
    X(int);
};

template<class T>
decltype(X() == int()) f(T const&){ return true; }

int main(void) {
  X x;
  f(x);
}

出力:

1>src\main.cpp(12): error C2248: 'X::X' : cannot access private member declared in class 'X'
1>          src\main.cpp(4) : see declaration of 'X::X'
1>          src\main.cpp(1) : see declaration of 'X'
4

1 に答える 1

7

どのバージョンのMSVC++を使用していますか?

それが価値があるかもしれないものは何でも、VC ++11ベータはあなたのコードを次のように拒否します:

trash.cpp(8): error C2893: Failed to specialize function template ''unknown-type' f(const T &)'
          With the following template arguments:
          'X'

これがこれまでで最も役立つ、または有益なエラーメッセージと呼ばれるものかどうかはわかりませんが、コード拒否しています。

このような状況では、バグレポートを提出しても、おそらくほとんど成果が得られないと思います。私が期待する応答は、基本的に「VC++11ですでに修正されています。可能な場合はアップグレードしてください」です。

于 2012-05-22T03:11:44.437 に答える