次の例を検討してください。
#include <iostream>
#include <memory>
#include <boost/optional.hpp>
struct X {
boost::optional<std::unique_ptr<int>> foo(int i) {
std::unique_ptr<int> t(new int{i});
return t;
// every compiler works with:
// return std::unique_ptr<int>(new int{i});
}
};
struct Y {
X x;
boost::optional<std::unique_ptr<int>> bar(int i) {
return x.foo(i);
}
};
int main()
{
Y{}.bar(42);
}
コピー不可能なオブジェクトの 2 つのチェーンされたコピー省略可能リターンがあります。gcc 5.2 では問題なくコンパイルされます。しかし、実際にコピーを実行しようとしているため、gcc 4.8 も clang 3.7 も好きではありません。どのコンパイラが正しいですか? この動作を許可するように gcc が意図的に変更されたと想定しています。これは、このような場合に特に役立つと思われます。