c ++中的命名空间别名

Ari*_*iel 8 c++ namespaces c++11

我使用c ++ 11,而我需要一些来自c ++ 17库的类.当使用添加类的boost时,我希望执行以下操作:

#if __cplusplus < CPP17
using std::any = boost::any;  
#endif
Run Code Online (Sandbox Code Playgroud)

不允许使用此类别名.同时扩展std命名空间会导致 未定义的行为.我希望我的代码看起来与c ++版本相同.有明确的方法吗?

son*_*yao 8

明确的方法是为其添加自定义名称.

#if __cplusplus < CPP17
using my_any = boost::any;
#else
using my_any = std::any;    
#endif

// using my_any...
Run Code Online (Sandbox Code Playgroud)

  • @Ariel正如您意识到的那样,不可能合法地"修改"std命名空间. (2认同)

eer*_*ika 6

您似乎正在尝试在命名空间中创建类型别名.核心语法是:

namespace namespace_name {
    using any = boost::any;
}
Run Code Online (Sandbox Code Playgroud)

但是,标准不允许在std命名空间中添加定义(模板特化的例外),因此如果您尝试定义std::any,程序的行为将是未定义的.

使用任何名称空间(包括全局名称空间)都可以,但不是保留给实现的名称空间,包括它的子名称空间std.

  • @Ariel我修改了我的答案.`std`中的定义不会使程序格式错误,它会使行为不确定.也就是说,形成不良不能保证阻止程序编译. (4认同)