const 临时变量为何选择调用非 const 成员函数而不是 const 成员函数? [重复]

问题描述 投票:0回答:1

示例代码取自: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

在第二次调用中,

T
是const限定的,所以
T()
应该调用const版本,对吧?或者我错过了一些特殊规则?

c++ visual-c++ visual-studio-2012 function-qualifier
1个回答
3
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.