Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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
Visual studio 2010 常量变量的静态断言_Visual Studio 2010_Visual Studio 2017_C++_Global Variables_Constants_Static Assert - Fatal编程技术网

Visual studio 2010 常量变量的静态断言

Visual studio 2010 常量变量的静态断言,visual-studio-2010,visual-studio-2017,c++,global-variables,constants,static-assert,Visual Studio 2010,Visual Studio 2017,C++,Global Variables,Constants,Static Assert,我有以下代码: const float foo = 5.0F; static_assert(foo > 0.0F, "foo must be greater than 0."); 但在我看来,这是一个错误: 错误C2057:应为常量表达式 我实际上做得很正确,只是没有正确地实现静态断言,对吗?在这种情况下,它按预期工作 对const和constepr之间的差异有一些评论。我理解这一区别,但是许多编译器支持使用静态断言,所以我会再次问,这是不是合法代码?我不关心编译器支持它,我关心它是

我有以下代码:

const float foo = 5.0F;

static_assert(foo > 0.0F, "foo must be greater than 0.");
但在我看来,这是一个错误:

错误C2057:应为常量表达式

我实际上做得很正确,只是没有正确地实现
静态断言
,对吗?在这种情况下,它按预期工作



const
constepr
之间的差异有一些评论。我理解这一区别,但是许多编译器支持使用
静态断言
,所以我会再次问,这是不是合法代码?我不关心编译器支持它,我关心它是不是在C++标准下定义的。

< P>代码> Foo> 0.0f 不是a:

  • 表达式e是一个核心常量表达式,除非按照抽象机器的规则对e进行求值 在下列用语中:
  • (2.7)左值到右值的转换,除非适用于

    (2.7.1)积分或枚举类型的非易失性GLV值 指一个完整的非易失性常量对象,前面有一个 初始化,使用常量表达式初始化,或

    (2.7.2)指字符串的子对象的非易失性glvalue 文字,或

    (2.7.3)指非易失性对象的非易失性glvalue 用constexpr定义,或引用 这样的物体,或

    (2.7.4)引用 非易失性对象,其寿命开始于e的评估范围内

    foo
    是浮点类型,对于
    foo>0.0F
    需要在
    foo
    上进行左值到右值的转换,这与上述条件不匹配,则
    foo>0.0F
    不被视为:

    常量表达式是指作为常量表达式(定义如下)的允许结果的实体的glvalue核心常量表达式,或者是其值满足以下约束的prvalue核心常量表达式


    另一方面,如果将
    foo
    声明为整型,代码就可以了。(使用
    constepr
    而不是
    const
    也有效。)

    foo>0.0F
    不是:

  • 表达式e是一个核心常量表达式,除非按照抽象机器的规则对e进行求值 在下列用语中:
  • (2.7)左值到右值的转换,除非适用于

    (2.7.1)积分或枚举类型的非易失性GLV值 指一个完整的非易失性常量对象,前面有一个 初始化,使用常量表达式初始化,或

    (2.7.2)指字符串的子对象的非易失性glvalue 文字,或

    (2.7.3)指非易失性对象的非易失性glvalue 用constexpr定义,或引用 这样的物体,或

    (2.7.4)引用 非易失性对象,其寿命开始于e的评估范围内

    foo
    是浮点类型,对于
    foo>0.0F
    需要在
    foo
    上进行左值到右值的转换,这与上述条件不匹配,则
    foo>0.0F
    不被视为:

    常量表达式是指作为常量表达式(定义如下)的允许结果的实体的glvalue核心常量表达式,或者是其值满足以下约束的prvalue核心常量表达式


    另一方面,如果将
    foo
    声明为整型,代码就可以了。(使用
    constepr
    而不是
    const
    也有效。)

    static\u assert
    需要C+11请参阅:您需要更新编译器才能使用它。@RichardCriten Visual Studio 2010支持它:可能需要重复投票才能关闭。在您的特定问题中,const可以在运行时初始化,而constexpr应该在编译时初始化time@Amadeus对于常量全局变量,需要有一个规则,它们是否可以是
    静态的_断言的
    ,您链接的问题不能回答这个问题。这不是重复项。
    static\u assert
    需要C+11请参阅:您需要更新编译器才能使用它。@RichardCriten Visual Studio 2010支持它:投票可能重复才能关闭。在您的特定问题中,const可以在运行时初始化,而constexpr应该在编译时初始化time@Amadeus对于常量全局变量,需要有一个规则,它们是否可以是
    静态的_断言的
    ,您链接的问题不能回答这个问题。这不是一个重复。所以我很感谢你的评论,它一定有一些优点,我在这里看到了2.7.1。但是为什么对
    foo
    进行比较需要左值到右值的转换呢?“好像我在把左值和原始文字进行比较。”乔纳桑米问了一个难题。从“我们需要左值到右值的转换来访问对象内部的值”,因此需要左值到右值的转换来提取
    foo
    的值进行比较。更准确地说,
    运算符>
    期望其操作数为PR值。顺便说一句,如果您直接使用literal代码,则根本不需要左值到右值的转换。我很难找到浮点比较调用左值到右值比较的明确说明。鉴于你的标准报价,这似乎是相当肯定的,这确实发生了,但我仍然希望明确澄清之前接受这个答案。问题就在这里:所以我很欣赏这个评论,它一定有一些优点,因为我在这里看到了2.7.1。但是为什么对
    foo
    进行比较需要左值到右值的转换呢?好像