考虑以下示例:
#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 故意更改以允许这种行为,这对于这种情况似乎特别有用。