gpt4 book ai didi

c++ - 为什么 bool 到 string 的隐式转换不是错误?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:32 25 4
gpt4 key购买 nike

我仔细查看并尝试在 SO 上找到类似的问题,但没有找到任何有用的信息。所以,在这里发布我的问题。

考虑这个程序:

#include <iostream>
void foo(const std::string &) {}
int main()
{
foo(false);
}
[Warning] converting 'false' to pointer type for argument 1 of 'std::basic_string::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator]' [-Wconversion-null]

Why C++ allows this without explicit cast? I was expecting to get compiler error. The program abnormally terminates at runtime due to exception displaying following:

terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

关于这种类型的隐式转换,标准是怎么说的?

最佳答案

在 C++11 引入 nullptr 关键字之前,空指针有点像 hack。任何等于零的整数文字都可以作为空指针常量,false 符合要求。

因此,您的程序的效果是使用 NULLchar const * 参数构造 std::string。构造函数不支持空指针,因此您会得到未定义的行为。

这个问题的解决方案是使用更新的 C++ 方言。如有必要,将 -std=c++11 传递给编译器,或将 -std=c++14 传递给编译器。然后你应该得到这样的东西:

error: no matching function for call to 'foo'

http://coliru.stacked-crooked.com/a/7f3048229a1d0e5a

编辑:嗯,GCC 似乎还没有实现此更改。这有点令人惊讶。您可以试试 Clang。

我已经 filed错误报告。

关于c++ - 为什么 bool 到 string 的隐式转换不是错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32009694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com