从三元运算符的一侧移出

时间:2015-07-23 03:40:47

标签: c++ c++11 gcc clang

我写的代码类似于:

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

gcc 5.2 disassembly

clang 3.6 disassembly

0 个答案:

没有答案