为什么const临时选择在const const上调用非const成员函数?

Fra*_*ahm 8 c++ visual-c++ const-method visual-studio-2012

示例代码取自: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
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Non-cv
Non-cv
Run Code Online (Sandbox Code Playgroud)

在第二次调用中,T是const限定的,所以T()应该调用const版本,对吧?还是有一些我错过的特殊规则?

Dav*_*eas 3

标准的相关引用是 5.2.3 [expr.type.conv]/2

\n\n
\n

表达式 T()(其中 T 是非数组完整对象类型或(可能是 cv 限定的)void 类型的简单类型说明符或类型名说明符)创建指定类型的纯右值,即值初始化(8.5;对于 void() 情况不进行初始化)。[注意:如果 T 是 cv 限定的非类类型,则在确定结果纯右值 (3.10) 的类型时将忽略 cv 限定符。\xe2\x80\x94结束注]

\n
\n\n

标准中的措辞明确提到(以非规范形式),对于非类类型, const-volatile 限定被删除,但在您的情况下,类型是 class 并且注释不适用。VS 似乎正在应用与非类类型相同的规则。

\n