使用模板基类的常量

时间:2015-12-20 00:43:57

标签: c++ gcc clang

下面的代码不是在g ++ 5.3.1下编译的,而是在clang 3.7.0下编译。哪个编译器是正确的?

[hidden] cat c.cpp
template <typename T>
struct Base {
  constexpr static int Align_ = alignof(T);
};

template <typename T>
struct Derived : Base<T> {
  using Base_ = Base<T>;
  using Base_::Align_;
  alignas(Align_) char buf[1];
};

编译输出:

[hidden] clang++ -c -std=c++14 c.cpp
[hidden] g++ -c -std=c++14 c.cpp
c.cpp:10:29: error: requested alignment is not an integer constant
   alignas(Align_) char buf[1];
                             ^
[hidden]
[hidden] g++ -v
Using built-in specs.
COLLECT_GCC=/usr/bin/g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
[hidden]
[hidden] clang++ -v
clang version 3.7.0 (http://llvm.org/git/clang.git 2ddd3734f32e39e793550b282d44fd71736f8d21)
Target: x86_64-unknown-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/3.4.6
Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/5.3.1
Selected GCC installation: /usr/lib/gcc/x86_64-redhat-linux/5.3.1
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64

1 个答案:

答案 0 :(得分:0)

它看起来像GCC中的一个错误,因为它应该按标准工作。从标准草案n4567

  

当alignment-specifier的格式为alignas( constant-expression )时:

     

(2.1) - 常量表达式 应为整数常量表达式

     

(2.2) - 如果常量表达式不计算为对齐值(3.11),或计算为扩展值   对齐和实现不支持声明上下文中的对齐,   该计划格式不正确。

在你的情况下,你提供了一个整数常量表达式。这只有在评估常量表达式不满足时才会失败

  

对齐表示为std :: size_t类型的值。有效对齐仅包括这些值   由基本类型的alignof表达式返回,另外还有一个附加的实现定义集   值可能为空。每个对齐值应为2的非负整数幂。

     

扩展对齐由大于alignof(std :: max_align_t)的对齐表示。它是   实现 - 定义是否支持任何扩展对齐以及它们的上下文   支持(7.6.2)。具有扩展对齐要求的类型是过度对齐类型。 [ 注意:   每个过度对齐的类型是或包含扩展对齐适用的类类型(可能通过   非静态数据成员)。