Я писал код, похожий на:
std::string foo(bool b, const std::string& fst, std::string&& snd) {
return b ? fst : std::move(snd);
}
и clang и скопировал snd
, а gcc
переместил его.
Я попытался свести к минимуму пример, и я придумал:
#include <iostream>
#include <utility>
struct printer {
printer() { }
printer(const printer&) { std::cout << "copy" << std::endl; }
printer(printer&&) { std::cout << "move" << std::endl; }
printer(const printer&&) { std::cout << "const rvalue ref" << std::endl; }
};
int main() {
const printer fst;
printer snd;
false ? fst : std::move(snd);
}
gcc 5.2 выходы
move
clang 3.6 выходы
const rvalue ref
Поддерживает ли стандарт как поведение gcc, так и clang?
Случайные наблюдения ниже:
Оба gcc и clang унифицируют тип тройки:
const printer