我们可以像下面这样初始化一个常量变量吗
int var1 = 10; const int var2 = var1;
这会在任何编译器中导致任何警告/错误吗?
vlju58qv1#
这取决于代码在哪里。如果它在一个函数中,那么var1和var2是自动的,那么是的,这是可以的。var2只能通过复制var1来初始化,所以var1可以在以后修改的事实与var2不能修改的事实没有关系。如果它在文件范围内,那么var1和var2是静态的,那么不,它不好。在文件作用域中的const integer对象必须初始化一个在编译时确定的值(在C++中这被称为“integer constant expression”,我忘记了这是否也是确切的C术语)。在这种情况下,您可能会认为,因为两个定义之间没有代码,所以var1的值在编译时应该是10,但因为类型是非const的,所以无论如何标准都禁止它。你可以认为这是为了避免实现需要足够聪明来应用这条推理路线,并证明没有任何东西能够修改var1:它只需要查看类型,而不是插入的代码。
var1
var2
10
kmbjn2e32#
是的,没关系。它是C和C++标准的一部分。一个常量对象可以用一个非常量对象初始化。为什么不呢?
2条答案
按热度按时间vlju58qv1#
这取决于代码在哪里。
如果它在一个函数中,那么
var1
和var2
是自动的,那么是的,这是可以的。var2
只能通过复制var1
来初始化,所以var1
可以在以后修改的事实与var2
不能修改的事实没有关系。如果它在文件范围内,那么
var1
和var2
是静态的,那么不,它不好。在文件作用域中的const integer对象必须初始化一个在编译时确定的值(在C++中这被称为“integer constant expression”,我忘记了这是否也是确切的C术语)。在这种情况下,您可能会认为,因为两个定义之间没有代码,所以var1
的值在编译时应该是10
,但因为类型是非const的,所以无论如何标准都禁止它。你可以认为这是为了避免实现需要足够聪明来应用这条推理路线,并证明没有任何东西能够修改var1
:它只需要查看类型,而不是插入的代码。kmbjn2e32#
是的,没关系。它是C和C++标准的一部分。一个常量对象可以用一个非常量对象初始化。为什么不呢?