相关疑难解决方法(0)

C++对象构造方法的区别

C++中不同的构造语法总是让我感到困惑.在另一个问题中,有人建议尝试初始化一个字符串

std::string foo{ '\0' };
Run Code Online (Sandbox Code Playgroud)

这有效并产生预期结果:长度为1的字符串仅包含空字符.在测试代​​码时,我不小心输入了

std::string foo('\0');
Run Code Online (Sandbox Code Playgroud)

这编译很好(即使没有警告-Wall),但在运行时终止

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

现在,据我所知,没有构造std::string接受一个字符作为参数,而这一假设是进一步证实了,当我试图通过间接的角色.

char b = '\0';
std::string a(b);
Run Code Online (Sandbox Code Playgroud)

这会产生一个很好的,冗长的编译错误.就像这样

std::string a('z');
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:什么允许std::string a('\0');编译,以及它与什么不同std::string a{ '\0' };


脚注:g++在Ubuntu上进行编译.这并没有把我当作编译器错误,但以防万一......

c++ string constructor c++11

20
推荐指数
1
解决办法
1025
查看次数

将0 int literal发送到const字符串参数时访问冲突

在VS2015和VS2017上,此编译没有警告,并生成无法捕获的访问冲突并导致应用程序崩溃.显然,int 0被静默转换为空指针,然后假定它指向一个字符串,从而崩溃.

#include <string>
#include <iostream>
void crash(const std::string& s) {}
int main()
{
    try
    {
        crash(0);
    }
    catch (const std::exception& ex)
    {
        // never gets here!
        std::cout << "got" << ex.what() << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何从这样的异常中捕获并恢复?如果我从函数参数中删除const它不会编译 - 所以这可能是防止用户滥用的一种方法,但是我会失去const提供的保护,或者我会吗?编写避免此问题的原型的最佳做法是什么?

c++

15
推荐指数
1
解决办法
794
查看次数

标签 统计

c++ ×2

c++11 ×1

constructor ×1

string ×1