C++11 如何执行基于范围的c++;11用于字符*argv[]上的循环?

C++11 如何执行基于范围的c++;11用于字符*argv[]上的循环?,c++11,for-loop,range,C++11,For Loop,Range,我想在char*argv[]上试用基于c++11范围的for循环,但我遇到了错误。目前的做法是: for( char* c : argv ) { printf("param: %s \n", c);

我想在
char*argv[]
上试用基于c++11范围的for循环,但我遇到了错误。目前的做法是:

for( char* c : argv )
{                                                                                               
   printf("param: %s \n", c);                                                                    
}
在我的makefile中,我有以下行:

g++ -c -g -std=c++11 -O2 file.cc

argv
是指向原始字符串的指针数组,不能直接从中获取范围


使用C++17可以使用
std::string\u视图
来避免分配字符串:

for (auto && str : std::vector<std::string_view> { argv, argv + argc })
{
    std::printf("%s\n", str.data()); // Be careful!
    std::cout << str << std::endl;   // Always fine
    fmt::print("{}\n", str);         // <3
}

您不能使用基于范围的循环,因为您没有范围

您可以编写自己的范围包装器(一种“数组视图”),也可以只使用普通循环:

for (char ** p = argv, e = argv + argc; p != e; ++p)
{
    // use *p
}
使用包装器:

#include <cstddef>

template <typename T>
struct array_view
{
    T * first, * last;
    array_view(T * a, std::size_t n) : first(a), last(a + n) {}
    T * begin() const { return first; }
    T * end() const { return last; }
};

template <typename T>
array_view<T> view_array(T * a, std::size_t n)
{
    return array_view<T>(a, n);
}
#包括
模板
结构数组视图
{
第一,最后;
数组视图(T*a,std::size\T n):第一个(a),最后一个(a+n){
T*begin()常量{return first;}
T*end()常量{return last;}
};
模板
数组\u视图\u数组(T*a,std::size\u T n)
{
返回数组_视图(a,n);
}
用法:

for (auto s : view_array(argv, argc))
{
    std::cout << s << "\n";
}
for(自动s:view_数组(argv,argc))
{

std::这行得通吗,但是:创建向量难道不是一种开销吗?其次,为什么我不能使用
printf(“参数:%s\n”,str);
(我得到:
不能通过“…”传递可复制类型为“const class std::basic_string”的对象)
?要从
std::string
获取
const char*
,请使用成员函数:
printf(“参数:%s\n”,str.c_str())在我的VIM中,它是在每一个C++文件上的文件,我在下面的行中得到如下:<代码>请求“STR”中的成员'cySTR ',它是非类类型的const int’/CODE。
上面的代码编译并运行良好,您可以调用
g++-c-g-std=c++11-O2 test.cpp
,因此您在这里遇到了一些不相关的问题。我已将auto更改为
std:string
,并消除了它们:)可能重复的
for (auto s : view_array(argv, argc))
{
    std::cout << s << "\n";
}