我写的代码类似于:
std::string foo(bool b, const std::string& fst, std::string&& snd) {
return b ? fst : std::move(snd);
}
并且在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