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 可能是编译器错误,也可能是安装错误。