这个问题源于libstdc++为什么
dual ABI
. 从这两个重要的陈述中:(1)它被专门介绍为在如何
string
(以及与本讨论无关的其他内容)作品;(2)
_GLIBCXX_USE_CXX11_ABI
独立于一个方言,用于编译C++ 03和C++ 11。
regex
模块在第11个标准中引入,并在内部使用字符串。因此,您构建了C++- 11(或更高)模板
basic_regex
代码
_GLIBCXX_USE_CXX11_ABI=0
. 这意味着你正在使用C++ 11。
正则表达式
对象,使用字符串的pre-c++-11实现。
这样行吗?取决于如何
正则表达式
使用字符串,如果它确实依赖于新的实现(例如,写时禁止复制),则为“否”,否则为“是”。会发生什么?什么都可以。
从根本上说,你不应该使用
_ glibcxx_使用_cx11_abi=0
对于任何使用后C++ 03方言的新代码(即C++-11,14,17,…),因为它引入了与标准对象的新保证不兼容的实现,尤其是
std::string
.
我能用吗
_ glibcxx_使用_cx11_abi=0
用STD & Gt=C++- 11?GCC开发人员注意到,您可以使用旧的ABI运行新的东西,这有利于使用旧的共享库运行新的功能。然而,这可能不是一个好主意,也因为代码在一个新的标准中,但是标准库不符合这个标准,以后可能会很糟糕。你的问题就是一个例子。你可以把两个ABI混合在一起,我们就在这里,它不起作用。
_ glibcxx_使用_cx11_abi=0
例如,如果你打电话,
foo(std::string const&)
在一些库中定义,用一个旧的abi编译。然后,在新的源文件中,您希望使用旧的ABI编译这个源文件。但所有其他的来源,你会保持一个新的ABI。
这个问题在几个版本的g++/libstdc++(我尝试了一些5.4到7.1的版本)。libc++不会发生这种情况。
libc++
没有这种二元性,即单一性
一串
实施。
我没有给出一个明确的答案,这个例外是从哪里来的,或者为什么。我只能猜测有一些共享的全球资源与
正则表达式
,
一串
或
locale
ABIS之间的区别不明显。不同的ABI使用它的方式也不同,它们可以导致任何事情,例如异常、段错误、任何意外行为。imho,我更喜欢遵守我上面提到的规则,这些规则最能反映
_ glibcxx_使用_cx11_abi
双ABI。