使用非常量函数参数初始化数组
Initialize array with a non-const function argument
是否有任何方法可以用非常量整数初始化数组,或者使现有变量为常量以使其成为有效参数?
bool f( const char s[], const int n )
{
char c[n]; // error: expression must have a constant value
}
没有,一般情况下没有。请改用vector<char> c(n)
。
简化的、几乎正确的解释:如果在编译时不知道n
是什么,编译器也不知道。因此,它不能为数组留出内存。这就是vector
存在的原因。
如果在其他地方需要,您可以始终使用&c[0]
来获取指向char的指针。
但显然,C99是有可能的。感谢@Matt McNabb指出这一点。如果你能等几年,你可能也能用C++编译它。同时使用vector
。
如果您坚持在C++中有一个"数组",则必须执行以下操作:
char* c = new char[n];
如果你的程序不能永远运行,或者经常这样做,你甚至可以保持原样,不必麻烦删除。不过,像Valgrind这样的工具可能会抱怨。
根据n
的来源,答案可能是否定的。如果n
可以是constexpr
,那么答案是肯定的。
有关constexpr的更多信息,请参阅这篇SO文章:您应该何时在C++11中使用constexpr功能?
n
位于堆栈上。在这种情况下,编译器需要在编译时知道n
的大小。您可以通过运算符new
动态分配内存,也可以使用std::vector
。
相关文章:
- C++转换参数初始化问题
- 在构造函数中使用可变参数初始化 std::tuple
- 类模板专用化演绎是否应该考虑演绎指南参数初始化?
- 如何通过参数初始化构造函数中的数组?
- 在模板类中使用"this"会导致参数初始化错误
- 如何使用一些参数初始化动态分配的数组中的对象
- 使用模板参数初始化静态 const 成员
- 基于模板参数初始化静态字符
- 使用参数初始化
- 使用参数包参数初始化"std::array"
- 从按值构造函数参数初始化的引用成员
- 使用派生的[C++]生成的参数初始化基类
- 一个C++默认参数可以用另一个参数初始化吗
- 如何用功能指针作为参数初始化静态成员的模板
- 用参数初始化另一类构造函数中的对象
- C :如何通过其构造函数的参数初始化类内部矩阵的尺寸
- C++:基于构造函数参数初始化向量
- 正在使用模板参数初始化stl类
- 如果类 A 修改其构造参数,我可以使用常量参数初始化 const A 吗?
- 使用结构非类型可变参数模板参数初始化结构的字符串数据成员