【发布时间】:2013-01-23 10:35:42
【问题描述】:
我有点假设基于范围的 for 循环将支持 C 风格的字符串
void print_C_str(const char* str)
{
for(char c : str)
{
cout << c;
}
}
但事实并非如此,标准[stmt.ranged] (6.5.4) 表示基于范围的适用于以下三种可能性之一:
- 范围是一个数组
- 范围是具有可调用
begin和end方法的类 - 在关联的命名空间(加上
std命名空间)中有可访问的 ADL
当我在全局命名空间中为 const char* 添加 begin 和 end 函数时,我仍然会收到错误(来自 VS12 和 GCC 4.7)。
有没有办法让基于范围的 for 循环与 C 风格的字符串一起工作?
我尝试将重载添加到 namespace std,这很有效,但据我了解,将重载添加到 namespace std 是非法的(这是正确的吗?)
【问题讨论】:
-
您可以合法地在 std 命名空间中专门化模板。
-
@bamboon true 但 IIRC 仅适用于用户定义的类型,这是重载而不是专门化,适用于内置类型,而不是 UDT。
-
你为什么要传递 C 字符串?
-
解决办法是不要把C字符串当成字符串。 std::string 已经够糟糕了,因为它缺少编码的概念。
-
@AlexChamberlain 我正在使用标准 C 字符串的原始 UDL
标签: c++ for-loop c++11 null-terminated