【发布时间】:2016-06-24 16:39:35
【问题描述】:
我习惯于在返回 std::unique_ptr 时不使用 std::move,因为这样做会禁止 RVO。我有这种情况,我有一个本地std::unique_ptr,但返回类型是std::shared_ptr。
以下是代码示例:
shared_ptr<int> getInt1() {
auto i = make_unique<int>();
*i = 1;
return i;
}
shared_ptr<int> getInt2() {
return make_unique<int>(2);
}
unique_ptr<int> getInt3() {
auto ptr = make_unique<int>(2);
return ptr;
}
int main() {
cout << *getInt1() << endl << *getInt2() << *getInt3() << endl;
return 0;
}
GCC 接受这两种情况,但 Clang 拒绝 getInt1() 并出现此错误:
main.cpp:10:13: error: no viable conversion from 'std::unique_ptr<int, std::default_delete<int> >' to 'shared_ptr<int>'
return i;
^
两个编译器都接受第三种情况。
哪一个是错的?谢谢。
【问题讨论】:
-
我怀疑,当我们了解您的需要时,我们将能够提供更好的答案。目前,这可以通过调用 make_shared 而不是 make_unique 轻松解决。我认为这是不可能的,这将有助于理解这个原因。
-
@Elliott:有什么可以解决的?他不是在问如何解决任何问题,而是在问他的代码是否符合标准。
标签: c++ gcc clang language-lawyer c++14