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

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

4

1 回答 1

3

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

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

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

于 2013-05-22T12:01:29.720 回答