最小限の例:
#include <iostream>
struct my_class
{
int i;
my_class() : i(0) { std::cout << "default" << std::endl; }
my_class(const my_class&) { std::cout << "copy" << std::endl; }
my_class(my_class&& other) { std::cout << "move" << std::endl; }
my_class(const my_class&& other) { std::cout << "move" << std::endl; }
};
my_class get(int c)
{
my_class m1;
my_class m2;
return (c == 1) ? m1 : m2; // A
//return (c == 1) ? std::move(m1) : m2; // B
//return (c == 1) ? m1 : std::move(m2); // C
}
int main()
{
bool c;
std::cin >> c;
my_class m = get(c);
std::cout << m.i << std::endl; // nvm about undefinedness
return 0;
}
編集済み:
g++ -std=c++11 -Wall -O3 ctor.cpp -o ctor # g++ v 4.7.1
入力:
1
出力:
default
default
copy
-1220217339
これはライン A またはライン C の In/Output です。代わりにライン B を使用すると、std::move
奇妙な理由が得られます。すべてのバージョンで、出力は入力に依存しません (i の値を除く)。
私の質問:
- バージョン B と C が異なるのはなぜですか?
- A と C のケースでコンパイラがコピーを作成するのはなぜでしょうか?