C++ 不带 RTTI 的 locale

标签 c++ rtti

我有以下代码:

#include <iostream>

class commaNumpunct: public std::numpunct<char> {
    protected:
        char_type do_decimal_point() const { return ','; }
};

int main(int argc, char** argv) {

    std::locale locale;
    std::locale locale2(locale, new commaNumpunct());
    std::cout.imbue(locale2);

    std::cout << 1.43 << std::endl;

    return 0;
}

如果我正常编译:

g++ main.cpp

我得到:

1,43
正如预期的那样。如果我编译它:

g++ -fno-rtti main.cpp

我得到:

Program received signal SIGSEGV, Segmentation fault.
__cxxabiv1::__dynamic_cast (src_ptr=src_ptr@entry=0x614c20, src_type=0x7ffff7dcb740 <typeinfo for std::locale::facet>, 
    dst_type=dst_type@entry=0x7ffff7dcd068 <typeinfo for std::locale::facet::__shim>, src2dst=src2dst@entry=-2) at /build/gcc-multilib/src/gcc/libstdc++-v3/libsupc++/dyncast.cc:72
72  /build/gcc-multilib/src/gcc/libstdc++-v3/libsupc++/dyncast.cc: No such file or directory.

有没有办法以这种方式使用区域设置,同时关闭 RTTI?

最佳答案

可能不是。

使用 std::use_facet 访问构面。事实上,它可能会抛出 bad_cast是一个非常强烈的迹象,表明它包含一个dynamic_cast。所以需要 RTTI。

关于C++ 不带 RTTI 的 locale,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49939459/

相关文章:

c++ - WinApi - 更改窗口样式

c++ - PC与Arduino串口通信

c++ - 如何声明一个 std::array of structs initialized inline with different values

python - Cython 导入工作一次 - 然后给出 gcc.bat 错误

c++ - 在 C++ 中创建类型 vector

c++ - 在没有 coredump 或 Segmentation Faults 的情况下退出程序

delphi - 如何链接 "parallel"类层次结构?

delphi - 如何检查后代类是否覆盖所有虚拟方法?

delphi - 自定义属性约束

c++ - 存储有关对象类型的信息