c++ constexpr类的全局类型

栏目: C++ · 发布时间: 7年前

内容简介:代码日志版权声明:翻译自: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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Concepts, Techniques, and Models of Computer Programming

Concepts, Techniques, and Models of Computer Programming

Peter Van Roy、Seif Haridi / The MIT Press / 2004-2-20 / USD 78.00

This innovative text presents computer programming as a unified discipline in a way that is both practical and scientifically sound. The book focuses on techniques of lasting value and explains them p......一起来看看 《Concepts, Techniques, and Models of Computer Programming》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码