示例代码取自: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限定被删除,但在您的示例中,类型是类,因此注释不适用。