我有自己的类型
namespace FaF
{
// Allocator is my own Memory Allocator for STL
using string = std::basic_string<char, std::char_traits<char>, Allocator<char>>;
}
FaF::string number("1234");
stoi( (const std::string &) number); <-- error
在使用 -Wall -Werror -Wextra
开关运行 gcc
时,使用 stoi(number) 又名 FaF::string&
会导致此错误:
error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
我尝试了很多 Actor ,但没有任何帮助。 std::string
和 FaF::string
或多或少是与内存分配器不同的相同类型。
我的问题:如何使用 stoi()/stof()
函数解决此问题?
更新:: 是的,当然,我可以使用 atoi( number.c_str() )
但我想了解这里的问题。
最佳答案
这是 sto*
函数类的一个不幸的问题;它们仅与std::string
一起使用。尽管他们不关心你使用什么分配器,但这仍然是类型的一部分,所以它对 C++ 仍然很重要。您也不能假装使用不同分配器的 basic_string
是 std::string
。
直到 C++17 solves this problem (kinda) ,您必须手动处理它:
stoi({number.data(), number.size()});
关于c++ - stof()/stoi() 与取消引用类型双关指针将打破严格别名规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38000552/