В настоящее время я пытаюсь получить libC++ для компиляции и запуска с помощью MSVC. При этом я столкнулся с неприятной ошибкой (по крайней мере, я думаю, это ошибка), которая заставила меня подождать. У меня есть следующий код: REPROC++ rvalue reference behavior (конкретный пример)
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) Что такое ожидаемое значение глобальной переменной globalInt после возврата foo (неопределенный может быть приемлемым ответом)?
EDIT:
мне дали понять, что это не работает в VS с MSVC 12. В обув переменная RVAL наведен на временное на стек и, таким образом, глобальный переменная никогда не увеличивается.
Временное создаётся в int & & оператор *() const. Если я заменяю:
return static_cast<int&&>(*__i);
с
return std::move(*i);
то все хорошо. Использование C-cast также создает временное создание.
Позвольте мне угадать, MSVC создает временную с этим 'static_cast'? Это не должно. –
Пятно на! Известная проблема? –
Я просто догадывался, как вы сформулировали свой вопрос. Но я не удивлюсь, если это известная ошибка. –