コード例をから取得され:どのようにして、constの一時関数はconst以外のメンバ関数をconst関数よりも呼び出したいのですか?
struct foo
{
void m() { std::cout << "Non-cv\n"; }
void m() const { std::cout << "Const\n"; }
};
template<class T>
void call_m()
{
T().m();
}
int main()
{
call_m<foo>();
call_m<const foo>(); //here
}
(私は少し変更された)、出力があるhttp://en.cppreference.com/w/cpp/types/add_cv :2番目の呼び出しで
Non-cv
Non-cv
、T
はCONST修飾されているので、T()
あるべきconstバージョンを呼び出してください。または私が逃したいくつかの特別なルールがありますか?
g ++ - 4.8とclang ++ - 3.2がconst関数を呼び出すため、MSVCのバグのように見えます。 – ForEveR
これは以前に起きたバグです。 MSVCは 'T()'の 'T'のconst修飾子を無視します。 –
言語の文言では、テンプレートの中で、 'T'が**非クラス**型で可能なconst-volatile修飾がある場合、* prvalue *を生成するときに修飾が削除される必要があります。それは、VSがクラスの型についても同じロジックを使用しているようです(間違って) –