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:
foo
是浮点类型,对于foo>0.0F
需要在foo
上进行左值到右值的转换,这与上述条件不匹配,则foo>0.0F
不被视为:
常量表达式是指作为常量表达式(定义如下)的允许结果的实体的glvalue核心常量表达式,或者是其值满足以下约束的prvalue核心常量表达式
另一方面,如果将
foo
声明为整型,代码就可以了。(使用constepr
而不是const
也有效。)foo>0.0F
不是:
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
进行比较需要左值到右值的转换呢?好像