【发布时间】:2019-09-03 23:45:53
【问题描述】:
当一个类有一个 constexpr 成员函数并且该成员函数在 constexpr 上下文中对一个左值对象进行求值时,clang 和 gcc 不同意结果是否是一个 constexpr 值。 为什么?是否有既不需要默认可构造性也不需要复制构造性的解决方法?
对象传值时,两个编译器都编译成功。
Clang 版本主干、8、7:static_assert expression is not an integral constant expression
和
Gcc 版本trunk、8.1、7.4:编译没有错误
#include <array>
using A = std::array<int, 10>;
void foo(const A& a){
// clang: static_assert expression is not an integral constant expression
static_assert(a.size() > 0, "");
}
void foo2(A a){
// this compiles on both clang and gcc
static_assert(a.size() > 0, "");
}
// Some custom code with the same symptom:
class B{
public:
constexpr int size()const{
return 42;
}
};
void foo3(const B& b){
// clang: static_assert expression is not an integral constant expression
static_assert(b.size() > 0, "");
}
void foo4(B b){
// this compiles on both clang and gcc
static_assert(b.size() > 0, "");
}
带有警告的解决方法:
void foo5(const B& b){
// This works in clang, if the default constructor is defined
static_assert(B().size() > 0, "");
}
void foo6(const B& b){
// This works in clang, if the copy constructor is defined
[](B b){static_assert(b.size() > 0, "");}(b);
}
【问题讨论】:
-
可以将
size定义为静态成员函数,使用B::size()。