内容简介:代码日志版权声明:翻译自:http://stackoverflow.com/questions/20370024/constexpr-global-of-class-type
我的理解是,类型的constexpr全局变量都是不可用的,因为
>这样的对象必须在每个TU中定义,因为constexpr不允许向前声明一个对象.
>默认链接为静态会导致命名内联函数中的对象(ODR-使用或不使用)违反ODR,因为相应的内联定义具有不同的含义.
>作为extern constexpr的声明,每个TU有一个定义,如果对象是使用ODR,则会导致ODR规则,当引用该引用时,会出现ODR规则.
>对于一个隐含的参数,即使没有被一个成员函数使用也是一个引用.
>如果您尝试通过引用传递对象,显然会发生.
>如果您尝试通过值传递对象,也会发生,该值隐式使用复制或移动构造函数,按定义通过引用.
如果对象被声明为extern constexpr,即使不使用ODR,GCC和Clang都会抱怨ODR违规(多个定义).
这是否正确?有没有任何方法可以将constexpr的全局类类型包装在一个内联函数中?
全局constexpr变量可以使用一点宏观魔法和谚语间接的额外级别在头文件中定义ODR
#define PP_GLOBAL_CONSTEXPR_VARIABLE(type, var, value) \ namespace var##detail { \ template<class = void> \ struct wrapper \ { \ static constexpr type var = value; \ }; \ template<class T> \ constexpr type wrapper<T>::var; \ } \ namespace { \ auto const& var = var##detail::wrapper<>::var; \ }
宏提供了一个未命名的命名空间中的引用
到实现类模板中的对象实例.
标头内未命名的命名空间中的每个对象都会生成
每个翻译单元中包含其标题的唯一实例.
此外,为了防止ODR违规,重要的是对象
在例如功能模板的多个实例是相同的.
然而,对于参考,它们并不重要,它们具有不同的身份;
只要它们在实现中引用相同的对象实例
类模板.
您可以将此宏包装在标题中,并将其安全地包含在许多TU中而没有问题.
有关更多详细信息,请参阅有关Boost邮件列表的以下讨论:
http://lists.boost.org/Archives/boost/2007/06/123380.php代码日志版权声明:
翻译自:http://stackoverflow.com/questions/20370024/constexpr-global-of-class-type
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- QuickDAO4.1.3 发布,优化全局类型转换和新增多字段关联
- 全局变量,静态全局变量,局部变量,静态局部变量
- Thrift RPC 系列教程(2)——全局变量&全局常量
- 全局角度出发讨论敏捷
- 全局事务锁等待分析
- 避免全局变量
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Algorithms Illuminated (Part 2)
Tim Roughgarden / Soundlikeyourself Publishing, LLC / 2018-8-5 / USD 17.99
Algorithms are the heart and soul of computer science. Their applications range from network routing and computational genomics to public-key cryptography and machine learning. Studying algorithms can......一起来看看 《Algorithms Illuminated (Part 2)》 这本书的介绍吧!