切片std :: out_of_range to std ::异常在Visual Studio vs G 中
Slicing std::out_of_range to std::exception in Visual Studio vs g++
我注意到了以下行为(未参考),但是我找不到信息,如果我事先知道,我将允许我预测它。<<<<<<<<<<
与最小示例
#include <iostream>
#include <stdexcept>
int main()
{
try
{
// Added this and the next line to check that the exception
// created has already the what() set to the input string.
std::out_of_range d("Out of range exception");
std::cout << "d.what() = " << d.what() << std::endl;
throw d;
}
catch (std::exception e) // Captured by value
{
std::cout << e.what() << std::endl;
}
}
如果我用g++ -std=c++17
和Visual C 进行编译,则会获得不同的行为。第一个打印d.what() = Out of range exceptionnstd::exception
,第二次打印d.what() = Out of range exceptionnOut of range exception
。
原则上,当std::out_of_range
被值捕获并转换为std::exception
类型时,可能会切片。这意味着我期望在打印其what()
时从std::out_of_range
对象获得与对象相同的行为。
问题:我不知道该解释的部分是两个编译器的不同行为。这是因为这种切片是C 标准化中未定义的行为,还是这两个编译器中的一个不符合它?
额外的观察:我只是注意到,在此链接中,没有提及std::exception
类具有输入const char* const &
的构造函数,而在Microsoft网站中,他们包括了它。我的偶然例子表明,他们确实以不同的方式实施了这些类别。我的问题仍然是是否允许它们(如果这种行为不确定),或者其中一个不符合哪一个。
该对象仍在切片中;您可以使用typeid( e ).name()
打印出实际类型,并且显示为std::exception
。如您发现的那样,MSVC实现what()
将指针返回到std::exception
施工时间设置的字符串,因此当out_of_range
例外切成基础异常时,它不会丢失。
/https://en.cppreference.com/w/cpp/error/exception/exception,what what()"返回实现 - defined-defined字符串",因此MSVC可以自由这样做。
要打印类型,请将其添加到您的捕获块中:
std :: cout&lt;&lt;" e.what()="&lt;&lt;e.what()&lt;&lt;"实际类型="&lt;&lt;typeid( e).name()&lt;&lt;std :: endl;
- std::to_string - 'to_string' 不是 'std' 的成员 - Visual Studio Code 1.42.0
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- Visual Studio 无法显示 std::string 的值
- Visual Studio 2019 C++ and std::filesystem
- std::filesystem::create_directories Visual Studio 2017
- 为什么在Visual Studio 2013上的std::this_thread::sleep_for上死锁
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- std::array initalization with Visual Studio 2010
- 在 MacOS 上的 Visual Studio Code 中C++ - std::make_unique
- 使用 std::unique_ptr 的通用单链表,Visual Studio C++ Microsoft中存在未知的反
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- Visual Studio 2017中的哪些扩展在传入lambda时消除了"bool"与"std::function"的歧义?
- Visual Studio 2017 STL 可视化工具失败了一个 std::map<MyIntrusivePtr, std::tuple<....> >
- 在Visual Studio中删除成员std::vector::d ata()
- std::cout 如果从自定义分配器 (Visual Studio 2019) 调用,则不会输出
- std::experimental::source_location Visual Studio 中的实现
- std::p romise<T> 其中 T 必须在 Visual Studio 2017 中默认构造?
- 即使在包含 std 命名空间之后,fstream 在 Visual Studio 2017 中也无法正常工作
- Visual Studio 2015:std :: make_unique中没有签名/未签名的不匹配警告
- 我应该如何使 std::filesystem 看起来符合 Visual Studio 2015 的标准