gpt4 book ai didi

c++ - 使用更新的 C++ 标准向后移植的类型和模板扩展命名空间 std

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:14 25 4
gpt4 key购买 nike

目前我们正在开发一个库,该库允许在可能的情况下使用 C++11/14 功能和类型,但否则必须回退到 C++03 实现。鼓励此库的用户和开发人员使用命名空间 std 中的类型和模板。

当使用新版本的 C++ 标准引入的命名空间 std 中的类型时会出现问题,这些类型未随所使用的编译器一起提供。一个建议的选项是为某些不依赖于新语言特性的类型提供“向后移植”到命名空间 std 作为我们库代码的一部分,例如Fixed width integer types :

//file: std_backport.h

namespace std_backport {
typedef char int8_t; //for platforms where 'char' is 8 bit
typedef short int16_t; //for platforms where 'short' is 16 bit
//[and so on]
}

//enter 'sacred' territory and introduce the types to namespace std
namespace std {
using namespace ::std_backport;
}

另一个例子是VS2010在技术报告中提供的元组类型:

//file std_tuple_backport.h
#include <tr1/tuple> //std::tr1::tuple

namespace std {
using ::std::tr1::tuple;
}

当然,我们必须根据所使用的编译器提供检查以启用/禁用包含这些文件。

我对此事进行了一些研究并意识到一个事实,即extending the namespace std就像这是未定义的行为我想放弃这个想法。但比我遇到的this answer在 #4 中指出:

Putting anything in std namespace is an "undefined behaviour". That means the specification does not say what will happen. But if you know that on particular platform the standard library does not define something, just go ahead and define it. [...]

所以我的问题是:

  • 有人可以向我解释一下在这种情况下“未定义的行为”到底是什么意思吗?
  • 即使我们只提供来自较新标准的类型,像这样提供 C++11/14 兼容性是否被视为“不良做法”?
  • 有什么替代甚至更好的方法可以实现这种代码兼容性,而不必在自己的命名空间中定义命名空间 std 中的所有内容,并使用它代替命名空间 std?

最佳答案

Can please someone clarify to me what exactly is meant by 'undefined behavior' in this case?

与其他情况相同。该标准不保证任何行为。

程序可能无法编译、编译成功但崩溃、未崩溃但有预期输出,或意外输出取决于任何变量,例如编译器、CPU 架构或月相。就标准而言。

Is providing C++11/14 compatibility like this considered 'bad practice' even if we just provide types from a newer standard?

如果我关心程序的标准合规性 - 我经常这样做,那么我认为这是一种不好的做法。

What would be an alternative or even better way to achieve this kind of code compatibility without having to define everything from namespace std in an own namespace and use this instead of namespace std?

您不需要从 std 定义一切。只需在另一个命名空间中定义缺少的功能(或使用第三方实现),并使用 std 命名空间中的现有功能。

关于c++ - 使用更新的 C++ 标准向后移植的类型和模板扩展命名空间 std,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41185182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com