C++20 [[no_unique_address]] 在 GCC 中的错误?
C++20 [[no_unique_address]]'s bug in GCC?
C++20 引入了新属性:[[no_unique_address]]
,表示数据成员的地址不需要与其 class.[=18 的所有其他非静态数据成员不同的地址=]
所以我尝试使用这个新属性来实现我自己的向量,使分配器成为 class 成员:
#include <memory>
template <typename T, class Allocator = std::allocator<T>>
class vector {
T* begin_;
[[no_unique_address]] Allocator alloc_;
public:
vector() = default;
vector(const vector& other)
: begin_(other.begin_),
alloc_(std::allocator_traits<Allocator>::select_on_container_copy_construction(other.alloc_))
{ }
};
但是当我调用复制构造函数时:
vector<int> v;
vector v2(v);
GCC发生内部编译错误:
<source>: In copy constructor 'vector<T, Allocator>::vector(const vector<T, Allocator>&) [with T = int; Allocator = std::allocator<int>]':
<source>:11:99: internal compiler error: in assign_temp, at function.c:984
11 | alloc_(std::allocator_traits<Allocator>::select_on_container_copy_construction(other.alloc_))
| ^
Please submit a full bug report,
with preprocessed source if appropriate.
But the clang and MSVC can both compile correctly. 这是 GCC 错误吗?
更新: 当我为 GCC 使用标志 -O2
时,内部编译器错误神奇地消失了。
So is this a GCC bug?
可能。
internal compiler error
并不意味着编译代码中存在错误。不管代码是否正确,ICE 可能是编译器错误,也可能是安装错误。
C++20 引入了新属性:[[no_unique_address]]
,表示数据成员的地址不需要与其 class.[=18 的所有其他非静态数据成员不同的地址=]
所以我尝试使用这个新属性来实现我自己的向量,使分配器成为 class 成员:
#include <memory>
template <typename T, class Allocator = std::allocator<T>>
class vector {
T* begin_;
[[no_unique_address]] Allocator alloc_;
public:
vector() = default;
vector(const vector& other)
: begin_(other.begin_),
alloc_(std::allocator_traits<Allocator>::select_on_container_copy_construction(other.alloc_))
{ }
};
但是当我调用复制构造函数时:
vector<int> v;
vector v2(v);
GCC发生内部编译错误:
<source>: In copy constructor 'vector<T, Allocator>::vector(const vector<T, Allocator>&) [with T = int; Allocator = std::allocator<int>]':
<source>:11:99: internal compiler error: in assign_temp, at function.c:984
11 | alloc_(std::allocator_traits<Allocator>::select_on_container_copy_construction(other.alloc_))
| ^
Please submit a full bug report,
with preprocessed source if appropriate.
But the clang and MSVC can both compile correctly. 这是 GCC 错误吗?
更新: 当我为 GCC 使用标志 -O2
时,内部编译器错误神奇地消失了。
So is this a GCC bug?
可能。
internal compiler error
并不意味着编译代码中存在错误。不管代码是否正确,ICE 可能是编译器错误,也可能是安装错误。