【发布时间】:2013-05-17 10:58:09
【问题描述】:
示例代码取自: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 版本,对吗?还是我错过了一些特殊规则?
【问题讨论】:
-
看起来像 MSVC 中的一个 bug,因为 g++-4.8 和 clang++-3.2 调用了 const 函数。
-
是的,这是以前出现的错误。 MSVC 在
T()中忽略T的 const 限定符。 -
语言措辞要求在您的模板中,如果
T是具有可能 const-volatile 限定的 非类 类型,则在生成 prvalue。似乎 VS 对类类型也使用了相同的逻辑(不正确) -
@ForEveR 感谢您的评论,我现在明白了。
-
@DavidRodríguez-dribeas 哦,有道理。
标签: c++ visual-c++ visual-studio-2012 const-method