我目前正试图让libC++编译并使用MSVC运行。在这样做的过程中,我遇到了一个令人讨厌的bug(至少我认为是一个bug),这让我花了一段时间才搞定。我有以下的摄制代码:C++右值引用行为(具体示例)
int globalInt = 666;
class mini_move_iterator
{
public:
mini_move_iterator(int* i) : __i(i){}
int&& operator*() const
{
return static_cast<int&&>(*__i);
}
int* __i;
};
void foo(int&& rval)
{
// Smash stack
char stackUser[1000];
for (int i = 0; i < 1000; ++i)
stackUser[i] = 0xff;
rval += 1;
}
int main()
{
mini_move_iterator mmi(&globalInt);
foo(*mmi);
return 0;
}
我有几个问题:
1)这一法律,即有我避免误入未定义行为的领域(这肯定是语法上合法的)?
2)foo返回后(未定义可能是一个可接受的答案),全局变量globalInt的期望值是多少?
编辑:
我应该明确表示,这不是在VS正与MSVC 12. 富变量RVAL指向一个临时的堆栈,因此全球变量永远不会增加。
临时创建于int & & operator *()const。如果我更换:
return static_cast<int&&>(*__i);
与
return std::move(*i);
就万事大吉了。使用C-cast也会导致临时创建。
让我猜测,MSVC正在创建一个临时的'static_cast'?它不应该。 – 2015-04-02 10:19:48
现货!已知问题? – 2015-04-02 10:23:19
我只是猜测你构思你的问题的方式。但如果这是一个已知的错误,我不会感到惊讶。 – 2015-04-02 10:26:20