gpt4 book ai didi

c++ - 将 true/false 分配给 std::string:这是怎么回事?

转载 作者:IT老高 更新时间:2023-10-28 22:29:28 26 4
gpt4 key购买 nike

我在我的源代码上测试了一个 c++11 编译器,它在我的一个函数中发现了一个错误,我本来希望我的非 c++11 编译器也能捕捉到这个错误。我从一个返回类型为 std::string 的函数返回 false ......这是演示问题的代码

#include <iostream>

int main ( )
{
std::string str = false;

std::cerr << "'" << str << "'" << std::endl;

return 0;
}


$ g++ test.cpp -W -Wall -Wextra
$ ./a.out

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

我很惊讶这段代码编译没有问题。我从异常描述中怀疑是编译器将 false 转换为 0,然后转换为 NULL,并将其用作 char * 来尝试构造字符串。

但是,当我将 false 切换为 true 时,我得到的结果如下:

$ g++ test.cpp -W -Wall -Wextra
test.cpp: In function ‘int main()’:
test.cpp:5: error: conversion from ‘bool’ to non-scalar type ‘std::string’ requested

在我看来,这是一个更合理的结果。

有人可以澄清为什么会发生这种看似不一致的行为吗?也就是说,std::string a = false 可以编译,但是会抛出异常,而 std::string a = true 不会编译。

编辑:

作为引用,下面是使用 g++ 4.7 和 -std=c++11 生成的错误情况:

test.cpp: In function ‘int main()’:
test.cpp:5:23: warning: converting ‘false’ to pointer type for argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ [-Wconversion-null]

正如 CashCow 建议的那样,它确实接受 NULL

最佳答案

这是一种可怕的隐式转换,而且缺乏类型安全性。

std::string 从指针中获取构造函数false 降级为 0,成为空指针。

你不能将空指针传递给 std::string 的构造函数。

顺便说一下,当您使用 = 时,它是一个构造函数,而不是您在此处执行的赋值。

您的“严格”g++ C++11 编译器在编译时很好地为您捕获了错误。

而且它不会与 true 一起使用,因为它永远无法表示 NULL 指针。 C++11 有 nullptr。如果您尝试过:

std::string str = nullptr;

您的 C++11 编译器可能会编译它,然后您会收到运行时错误。

关于c++ - 将 true/false 分配给 std::string:这是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9670854/

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