C++ 通过引用传入的值的constexpr
我有一段编译的代码C++ 通过引用传入的值的constexpr,c++,constexpr,std-bitset,C++,Constexpr,Std Bitset,我有一段编译的代码 #include <bitset> struct A{ std::bitset<50> b; }; void test(A a){ static_assert(sizeof(int)*8 < a.b.size(), "can't accomodate int in bitset"); int x = 5; a.b = x; } int main(){ A a; test(a); } #包括
#include <bitset>
struct A{
std::bitset<50> b; };
void test(A a){
static_assert(sizeof(int)*8 < a.b.size(), "can't accomodate int in bitset");
int x = 5;
a.b = x; }
int main(){
A a;
test(a); }
#包括
结构A{
std::位集b;};
空隙试验(A){
静态断言(sizeof(int)*8
但事实并非如此
#include <bitset>
struct A{
std::bitset<50> b;
};
void test(A& a){
static_assert(sizeof(int)*8 < a.b.size(), "can't accomodate int in bitset");
int x = 5;
a.b = x;
}
int main(){
A a;
test(a);
}
#包括
结构A{
std::位集b;
};
孔隙测试(A&A){
静态断言(sizeof(int)*8
由于此错误而失败
const.cpp: In function ‘void test(A&)’: const.cpp:8:5: error: non-constant condition for static assertion
static_assert(sizeof(int)*8 < a.b.size(), "can't accomodate int in bitset");
const.cpp:8:5: error: ‘a’ is not a constant expression
const.cpp:In函数'void test(A&'):const.cpp:8:5:错误:静态断言的非常量条件
静态断言(sizeof(int)*8
为什么在第二种情况下,a.b.size()
不被视为constexpr?std::bitset::size()
的constepr
不是根据?或者在第二种情况下传递的非常量引用是否会触发编译器生成错误
编译器版本:
在Ubuntu14.0.4上的g++4.8.4,使用g++const.cpp-std=c++1y
和其他指针1编译,它似乎是gcc和clang中的一个编译器错误。它在gcc 5.1中已修复,但截至2019-07-25年,在clang 8.0中仍然是一个bug
这是5.1版中引入的gcc的一个bug。见其他答案
(一) 似乎是一个(现已修复)编译器错误,因为它符合最新的gcc版本:
A&A
在常量表达式中不可用,导致程序格式错误
禁止a.b.size()
为常量表达式且a
为a&
的规则如下:
如果变量是constexpr变量,或者是引用类型或const限定整数或枚举类型,并且其初始值设定项是常量初始值设定项,则在遇到初始化声明后,该变量在常量表达式中可用
在您的情况下,变量a
是:
- 未声明
(作为函数参数,它没有意义)constexpr
- 并且不是整型或枚举类型
- 并且不是初始化为常量初始值设定项的引用:
o
是将其完整表达式解释为常量表达式会产生常量表达式的初始值设定项,除非o
是对象,这样的初始值设定项还可以为o
及其子对象调用constexpr构造函数,即使这些对象是非文字类类型
以以下简化示例为例:
struct s { constexpr static bool true_value() { return true; } };
void assert_on(s const& ref)
{
static_assert(ref.true_value());
}
int main()
{
assert_on(s{});
}
gcc-9错误地接受it1,但clang-8产生正确的诊断:
完整演示:
1) 这是从5.1版开始生效的,尚未解决。这是否可能是gcc的错误,clang是正确的?@songyuanyao clang不是唯一一个抱怨的人。仔细阅读后,我确信这一点。请参阅其他答案。那么,有没有办法实现我的目标,即静态检查传入变量(by ref)的位集成员是否足以容纳整数?这是答案的一半,另一半是
error: static_assert expression is not an integral constant expression