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);   
}

我有两个不可复制对象的链式复制可删除返回。gcc 5.2 编译得很好。但是 gcc 4.8 和 clang 3.7 都不喜欢它,因为实际上是在尝试执行复制。哪个编译器是对的?我假设 gcc 故意更改以允许这种行为,这对于这种情况似乎特别有用。

4

0 回答 0