c++ - 声明的含义是什么,例如无效a(字符串b = 0)

标签 c++ parameters constructor undefined-behavior default-arguments

我编写了一个带有可选 string 参数的函数,但意外地没有将其默认为 "",而是将其默认为 0:

void a(string b=0)

我编译时没有任何警告或其他情况。

如果没有(!!!)在默认参数的情况下使用内容(根据其他参数,这个参数仅在显式设置时使用),这会导致附近代码中出现非常奇怪的行为。

再说一遍:我没有使用那个空值字符串,但在更改附近的代码位置时出现了段错误。

我的问题,因为编译器没有提示:该语法的含义是什么,将某些复杂参数(非数字、非指针)默认为 0

========================================== 不小心写了

void a(string b=0)

而不是

void a(string b="")

预计编译器会因语法错误而失败,但编译正常。

最佳答案

当使用 0 构造 std::string 时,编译器将为 std::string 类选择以下重载构造函数:

basic_string(const charT* s, const Allocator& a = Allocator());

但是,传递空指针作为第一个参数,而不是以空结尾的 C 字符串,是未定义的行为

关于c++ - 声明的含义是什么,例如无效a(字符串b = 0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75214710/

相关文章:

c++ - 包含后增量的表达式能否与 C++ 中该表达式的其他部分并行执行?

c - 未定义对 crcsum 的引用(unsigned char const*,unsigned long,unsigned short)

java - 向 Apache HttpPost 添加参数

c++ - 哪些 std::async 实现使用线程池?

c++ - 可变大小的对象可能未被初始化

c++ - 与 g++ 的链接选项

facebook - 将 Youtube 视频嵌入 Facebook 并在特定时间码播放

c# - 实例构造函数中的 lock()

C++ 重载运算符、构造函数等

c++ - C++17 中 protected 构造函数的规则改变了吗?