有没有办法避免数组到指针衰减
Is there a way to avoid array-to-pointer decay?
main char* argv[]
的参数衰减为 char**
,这是不幸的,因为它不能与只接受数组的std::begin
一起使用。我看到的唯一解决方法是使用不可取的可变长度数组。
#include <iostream>
int main(int argc, char* argv[])
{
char* _argv[argc];
for (int i = 0; i < argc; ++i)
_argv[i] = argv[i];
for (arg : _argv)
{
std::cout << arg << " ";
}
return 0;
}
我希望我想要这样的东西:char* _argv[] = { ... };
这是不可能的,因为 main 的签名是固定的。您可以使用以下命令将元素复制到vector
:
std::vector<std::string> args {argv, argv + argc};
然后,您可以在args
上使用std::begin
您可以定义一个简单的类包装器来为您提供begin()
和end()
。
struct Args {
int argc_;
char **argv_;
Args (int argc, char *argv[]) : argc_(argc), argv_(argv) {}
char ** begin () { return argv_; }
char ** end () { return argv_ + argc_; }
};
int main(int argc, char *argv[]) {
for (auto s : Args(argc, argv)) {
std::cout << s << 'n';
}
return 0;
}
我看到的唯一解决方法是使用可变长度数组,即 不良。
唯一的解决方法到底是什么?没有问题。如果您确实需要 string
的数组,请使用 TNA 答案中所示的vector
;我怀疑您是否需要修改参数。
如果您只需要遍历它,则无需复制所有指针。
for (auto str : boost::make_iterator_range(argv, argv + argc))
std::cout << str;
或
for (auto ptr = argv; ptr != argv + argc; ++ptr)
std::cout << *ptr << 'n';
要
main
char* argv[]
的参数衰减为char**
,即 不幸的是,因为它不能与std::begin
一起使用 接受数组。
没有其他办法。命令行参数的数量在编译时是未知的,这种传递它们的方法(而不是使用两个指针到指针(是出于历史动机。
相关文章:
- 为什么这些函数不衰减到函数指针?
- 为什么多维数组中的空字符串文本衰减为空指针?
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 数组变量衰减为指针
- 如果我只有指向第一个数组元素的指针,考虑到数组衰减,是否可以找到数组的长度?
- 在分配给指针到固定数组期间没有指针衰减
- 如果一个函数通过引用返回一个数组,它是指针的衰减吗?
- 推断衰减到函数指针的 lambda 类型
- 应该非捕获通用的lambdas衰减以发挥指针
- 数组衰减为指针和重载分辨率
- 运行时大小的数组和指针衰减
- 编译器在数组到指针衰减存储中生成的指针在哪里
- 为什么指针衰减优先于推导的模板
- 有没有办法避免数组到指针衰减
- 为什么数组类型不会衰减到类模板的指针
- 我能逆转数组到指针衰减的过程吗?
- 数组到指针衰减问题
- 为什么在模板函数中数组衰减为指针?
- 数组衰减为Lambda指针
- 如果通过模板函数中的 const 引用传递,数组不会衰减到指针