Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用传入的值的constexpr_C++_Constexpr_Std Bitset - Fatal编程技术网

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