2

次の例を検討してください。

#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 が意図的に変更されたと想定しています。これは、このような場合に特に役立つと思われます。

4

0 に答える 0