このプログラムをC++ 11コンパイラでコンパイルすると、ベクタは関数から移動されません。3値演算子の結果が右辺値ではない
#include <vector>
using namespace std;
vector<int> create(bool cond) {
vector<int> a(1);
vector<int> b(2);
return cond ? a : b;
}
int main() {
vector<int> v = create(true);
return 0;
}
このようなインスタンスを返すと、そのインスタンスが返されます。
if(cond) return a;
else return b;
ここにはdemo on ideoneがあります。
gcc 4.7.0とMSVC10で試しました。どちらも同じように動作します。
これはなぜですか?
3つの演算子の型は、returnステートメントが実行される前に評価されるため、左辺値です。この時点で、aとbはまだxvaluesではない(期限切れになる)。
この説明は正しいですか?
これは標準の欠陥ですか?
これは明らかに意図された動作ではなく、私の意見では非常に一般的なケースです。
"第2オペランドと第3オペランドが同じ値カテゴリのglvaluesで、同じ型を持つ場合、結果はその型と値のカテゴリになります[...]"§5.16/ 4 – Mat
いずれの例もrvaluesまたはxvaluesを含みません。しかし、なぜコピーが移動の代わりに行われるのかという興味深い質問です。 – aschepler