8

サンプルコードはhttp://en.cppreference.com/w/cpp/types/add_cvから取得しまし た (少し変更しました。)

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
}

出力は次のとおりです。

Non-cv
Non-cv

2 番目の呼び出しでTは、const が修飾されているのでT()、const バージョンを呼び出す必要がありますよね? または、私が見逃した特別なルールはありますか?

4

1 に答える 1

3

標準からの関連する引用は 5.2.3 [expr.type.conv]/2 です

式 T() (T は非配列完全オブジェクト型または (おそらく cv 修飾された) void 型の単純型指定子または型名指定子) は、指定された型の prvalue を作成します。 value- 初期化済み (8.5; void() の場合、初期化は行われません)。[注: T が cv 修飾された非クラス型である場合、結果の prvalue の型を決定するときに cv 修飾子は無視されます (3.10)。—終わりのメモ]

標準の文言では、非クラス型の場合、 const-volatile 修飾が削除されることを (非規範的な形式で) 明示的に言及していますが、あなたの場合、型はclassであり、注は適用されません。VS は、非クラス型に適用されるのと同じルールを適用しているようです。

于 2013-05-22T12:01:29.720 に答える