2012-02-24 8 views
2

std::is_assignableタイプの特性を使用する必要がありました。これは、サポートしたい最も古いコンパイラバージョンでは使用できません。私はこれを実装しなければならなかったので(私はそれを認めます、いくつかのinterwebsが覗いていました)、これは私の実装のバグかstd::is_assignableの一般的な問題かどうか疑問に思います。constメンバを持つ構造体を割り当てることができるのはなぜですか?

まず第一に、これは私のテスト構造体されています。しかし、それは私に語った、Barが割り当て可能である

struct Bar { 
    bool const cb; // this should kill the default assignment operator 
    int i; 
}; 

、ここでは私のstdreplace::is_assignable

template <typename T> struct is_assignable : private std::__sfinae_types { 
    private: 
    template <typename T1> 
     static decltype(std::declval<T1>() = std::declval<T1>(),__one()) test(int); 
    template <typename T1> 
     static __two test(...); 
    public: 
    static bool const value = sizeof(test<T>(0)) == sizeof(__one); 
}; 

さ:

int: 1 
Bar: 1 
int[2]: 0 

問題はどこだ?

+0

ブール変数名を予約済みのキーワード以外に変更しようとしましたか? –

+0

@pwny:ああ男の子。私は 'Bar'構造体を手作業でタイプしたので、これは*の質問では*でした。私はこの問題を修正しました**ありがとうございました**! – bitmask

+0

Hehe all good私はちょうどこれがいくつかの奇妙なコンパイラのトリックはこれのために動作していないことを確認していた。 –

答えて

3

あなたのコンパイラでは、割り当て演算子が正しく削除されていない可能性があります。暗黙的に宣言された特別なメンバ関数に関するC++ 03コードでは、評価されないオペランド内でのそのような割り当ては、評価されたオペランド内で発生した場合、その割り当てが不正であっても問題ありませんでした。その理由は、asignment演算子が暗黙的に定義されることはなく、暗黙的に宣言されるだけなので、エラーを発生させることはないからです。

これがC++ 11で変更され、代入演算子が自動的に削除されるはずですので、コンパイラが間違っていると思われます。

+0

私は参照してください。私はそれ以上の疑念を抱いていました。なぜなら、さらなる調査と異なる試みが、以前のものよりも意味がなくなったからです。私はバグレポートを提出したいと思いますが、それはすでに新しいバージョンで修正されています。 – bitmask

関連する問題