我有以下代码:
#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/