使用初始化列表和 make_unique 创建 unique_ptr 的列表在 GCC 5.4 中失败
Creating list of unique_ptr using initialization list and make_unique fails in GCC 5.4
我正在使用 GCC 5.4 在 C++ 14 中编译测试程序。
#include <type_traits>
#include <list>
#include <iostream>
#include <memory>
int main()
{
int VALUE = 42;
const auto list_ = {
std::make_unique<int>(VALUE),
std::make_unique<int>(0),
std::make_unique<int>(0)
};
}
GCC 5.4 失败并显示以下错误消息:
<source>: In function 'int main()':
<source>:13:5: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]'
};
^
In file included from /opt/compiler-explorer/gcc-5.4.0/include/c++/5.4.0/memory:81:0,
from <source>:4:
/opt/compiler-explorer/gcc-5.4.0/include/c++/5.4.0/bits/unique_ptr.h:356:7: note: declared here
unique_ptr(const unique_ptr&) = delete;
^
相同的代码可以使用 Clang 3.5 正确编译。参见 https://godbolt.org/z/PM776xGP4
问题似乎一直存在,直到 GCC 9.2 正确编译。
这是 GCC 9.1 及以下版本中的已知错误吗?如果是,有没有办法使用初始化列表来解决这个问题?
您可以使用:
const std::initializer_list<std::unique_ptr<int>> list{
std::make_unique< int >( 42 ),
std::make_unique< int >( 0 ),
std::make_unique< int >( 0 )
};
Demo(旧 gcc-5.4 测试)。
我正在使用 GCC 5.4 在 C++ 14 中编译测试程序。
#include <type_traits>
#include <list>
#include <iostream>
#include <memory>
int main()
{
int VALUE = 42;
const auto list_ = {
std::make_unique<int>(VALUE),
std::make_unique<int>(0),
std::make_unique<int>(0)
};
}
GCC 5.4 失败并显示以下错误消息:
<source>: In function 'int main()':
<source>:13:5: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]'
};
^
In file included from /opt/compiler-explorer/gcc-5.4.0/include/c++/5.4.0/memory:81:0,
from <source>:4:
/opt/compiler-explorer/gcc-5.4.0/include/c++/5.4.0/bits/unique_ptr.h:356:7: note: declared here
unique_ptr(const unique_ptr&) = delete;
^
相同的代码可以使用 Clang 3.5 正确编译。参见 https://godbolt.org/z/PM776xGP4
问题似乎一直存在,直到 GCC 9.2 正确编译。
这是 GCC 9.1 及以下版本中的已知错误吗?如果是,有没有办法使用初始化列表来解决这个问题?
您可以使用:
const std::initializer_list<std::unique_ptr<int>> list{
std::make_unique< int >( 42 ),
std::make_unique< int >( 0 ),
std::make_unique< int >( 0 )
};
Demo(旧 gcc-5.4 测试)。