【发布时间】:2011-06-26 13:53:29
【问题描述】:
void foo (const std::string &s) {}
int main() {
foo(0); //compiles, but invariably causes runtime error
return 0;
}
编译器 (g++ 4.4) 显然将0 解释为char* NULL,并通过调用string::string(const char*, const Allocator &a = Allocator()) 构造s。这当然没用,因为 NULL 指针不是指向 c 字符串的有效指针。当我尝试调用 foo(1) 时不会出现这种误解,这有助于产生编译时错误。
当我不小心调用像这样的函数时,是否有可能在编译时得到这样的错误或警告
void bar(const std::string &s, int i=1);
使用bar(0),忘记string,实际上是想拥有i=0?
【问题讨论】:
-
如果没有编译器的帮助,这并不是真的。一些实现添加了一个私有
basic_string(int)来捕获这种情况。如果没有,我猜你运气不好。 -
我很惊讶这个通过 gcc,它以其丑陋的错误/警告而闻名,但我会在这里期待一些东西。你提高警告级别了吗?
-
@Matthieu 我找不到任何给我警告的选项,但我并不真正喜欢 gcc 警告选项。无论如何,
-W -Wall -Wpointer-arith -Wcast-qual并不能解决问题。 -
我用clang测试过(使用gcc头文件),它也没有触发任何警告:(
标签: c++ string g++ null-pointer