VS2010中的const问题
const problem in VS2010
我有一个最短的问题:
为什么这在VS2010中不起作用?
string keyword("lookuptable");
const int kwSize = keyword.size();
char oldBuffer[kwSize+1];
它在GCC中运行良好。VS2010告诉我
"表达式必须具有常数值"
我正在使用Win32控制台应用程序/空项目。
我使用的绝对没有什么特别的,只是
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
using namespace std
它是cpp文件中的一个主函数。
数组的大小必须是整数常量表达式或ICE(这意味着它必须在编译时已知)。您可以在ICE中使用const int
,但前提是其初始值设定项本身就是ICE。
像keyword.size()
这样的函数调用在ICE中不可用,因此kwSize
在ICE中也不可用。
如果它在gcc中"完美工作",那要么是由于错误,要么是某种语言扩展
在C++0x中,一些函数调用可以在积分常量表达式中使用,但它们必须是constexpr
函数,并且它们的使用受到限制。据我所知,目前还没有一个编译器完全支持constexpr
。在任何情况下,std::string::size
都不是constexpr
。
GCC有一个允许可变长度数组的语言扩展。Visual C++没有。必须使用固定的编译时常数初始化基于堆栈的数组。
正如其他人所提到的,非常量数组边界是GCC的扩展(可能是其C99支持的一个附带好处-C99确实允许非常量数组界限)。如果你想在C++中使用这个,你应该使用vector
:
std::vector oldBuffer(kwSize + 1);
要将其转换为char *
,请执行以下操作:
&oldBuffer[0]
虽然严格地说,这不是C++0x之前的有效C++,但它在我迄今为止遇到的每一个编译器中都能正常工作。C++0x追溯性地支持这种用法,并且还提供了等效的oldBuffer.data()
。
答案是"表达式必须具有常数值"。const必须是在编译时解析的内容。
keyword.size()
在运行时求值,因此它不是编译时常数。根据编译器的不同,可能不允许使用取决于某个运行时值的数组大小。
关于gcc 中可变数组长度的一些进一步信息
- 违反const正确性:我应该现实地期待什么问题
- 关于重载 -> 运算符中 const 关键字的特定位置的问题
- 从const ptr*转换为ptr*时出现问题
- 语法问题:"char [5] const &"是什么意思?
- 使用 const double* const 作为模板参数 - 代码性能问题
- 当对象被其他对象引用时,关于 const 限定符的微妙问题
- char,const char*阵列问题,用于mqtt client.publish
- 汇编问题试图使用qobject_cast进行const指针
- 将 API 函数参数从 'char *' 更改为"const char *"有哪些潜在问题?
- 使用 LLVM 从 const void * 转换为模板类型时出现问题
- const int&performance 问题
- 有关 const decltype(x)& 的问题
- const void*对象初始化问题C++
- 交换与使用std::map[]运算符赋值(const问题)
- 错误 C2280;运算符 =(const Employee &) 在执行 employees.erase() 时出现问题
- 调用接受三个参数的函数出现问题,其中一个是 int const
- 如何解决此问题:从 'const char*' 到"const uint8_t* 的转换无效
- 在将字符串从std::string转换为const char *时出现数据丢失问题
- 如何使用顶级const来解决此问题
- 在const函数中修改私有int存在问题