【发布时间】:2014-07-09 19:37:54
【问题描述】:
发件人:Is it safe to overload char* and std::string?
#include <string>
#include <iostream>
void foo(std::string str) {
std::cout << "std::string\n";
}
void foo(char* str) {
std::cout << "char*\n";
}
int main(int argc, char *argv[]) {
foo("Hello");
}
上面的代码在使用g++-4.9.0 -ansi -pedantic -std=c++11编译时打印“char*”。
感觉这样不对,因为字符串字面量的类型是"array of n const char",应该不可能初始化一个非const@ 987654327@ ,所以应该选择 std::string 重载。这里 gcc 违反标准了吗?
【问题讨论】:
-
您还会收到一条警告:不推荐将字符串常量转换为 'char'(您需要
-Wall或-Wwrite-strings来实现)。不,这是不正确的。 -
@jrok 如果编译器实际上错误地编译了格式正确的程序,警告有什么用? ://
-
@jrok:在这种情况下不是,因为我们有一个具有完美定义行为的程序并且编译器编译它错误。这将其从“符合语言扩展”的划分转变为不符合标准的实现。
-
@Deduplicator 这不是真正的错误。那个人实际上是在抱怨编译器在使用带有
char *的函数的字符串文字时冒昧地发出警告。
标签: c++ c++11 language-lawyer overload-resolution