为什么const临时函数选择调用非const成员函数而不是const成员函数?

How come a const temporary chooses to call a non-const member function over a const one?

本文关键字:函数 const 成员 调用 选择 为什么      更新时间:2023-10-16

示例代码取自:http://en.cppreference.com/w/cpp/types/add_cv(我修改了一点)

struct foo
{
    void m() { std::cout << "Non-cvn"; }
    void m() const { std::cout << "Constn"; }
};
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版本,对吗?还是我错过了一些特殊的规则?

标准中的相关引语为5.2.3 [exp .type.conv]/2

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

标准中的措辞明确地提到(以非规范的形式)对于非类类型,const-volatile限定被删除,但在您的示例中,类型是,因此注释不适用。