【发布时间】:2011-09-14 12:22:41
【问题描述】:
我正在尝试解决decltype 将大大简化事情的问题,但我在*this 上使用decltype 并添加const 限定符时遇到了问题。下面的示例代码演示了这个问题。
#include <iostream>
struct Foo
{
void bar()
{
static_cast<const decltype(*this)&>(*this).bar();
}
void bar() const
{
std::cout << "bar" << std::endl;
}
};
int main(int argc, char* argv[])
{
Foo f;
f.bar(); // calls non-const method
return 0;
}
代码在 MSVC2010 中编译,但会递归执行,直到发生堆栈溢出。
Ideone 报告编译器错误
prog.cpp: In member function 'void Foo::bar()':
prog.cpp:7:38: error: 'const' qualifiers cannot be applied to 'Foo&'
如果我换行
static_cast<const decltype(*this)&>(*this).bar();
到
static_cast<const Foo&>(*this).bar();
它按预期工作。
我是否误用或误解了 decltype?
【问题讨论】:
-
const_cast可能会更好地表达意图。 -
@Cubbi 向谁表达意图?
-
@Jesse :我认为他的意思是
const_cast<Foo const*>(this)->bar();在这种情况下比任何涉及decltype的东西都更容易阅读。 -
@ildjam 我的意思是建议使用 const_cast 来表明所有复杂的表达式所做的只是改变 constness,但looks like I was wrong。
-
@Potatoswatter - 你抓住了我。 ;) 我确实在预处理器宏中使用
decltype为涉及 const 正确性的某个习语“生成”一些代码。我意识到预处理器并不是理想的代码生成工具。
标签: c++ constants c++11 decltype