首先,我正在使用 Clang 3.4.1
我正在编写一个全局变量,它必须充当编译时上下文的占位符(主要作为值模板参数)。为此,我编写了一个名为的 constexpr 类chameleon
(它模仿任何运行时值的行为):
struct chameleon
{
template<typename T>
constexpr operator T() const
{
return T{};
}
constexpr chameleon() = default;
};
由于转换运算符和构造函数都指定为constexpr
,我能够在编译时创建该类的实例。例如 https://ideone.com/KhAN6R:
template<int foo>
struct bar
{};
using mytype = bar<chameleon{}>;
由于这有效,并且我在其他地方使用它,所以我决定编写这样的占位符类型
只是继承自chameleon
:
template<std::size_t I>
struct placeholder : public chameleon
{
using chameleon::chameleon;
};
我使用的是 C++11,所以我只使用了“新”(C++11 已经三年了......)继承构造函数功能。
声明占位符变量时:
constexpr const placeholder<0> _1;
编译器拒绝该代码,称它需要用户定义的默认构造函数进行初始化。所以“嗯,继承 ctors 不会传播 constexpr 或类似的东西”是我的想法。然后我将 using 更改为默认的 ctor 声明:
template<std::size_t I>
struct placeholder : public chameleon
{
constexpr placeholder() = default;
};
现在编译器说:
错误:const 类型“const placeholder”对象的默认初始化需要用户提供的默认构造函数
如果我改变= default
到手动定义的空构造函数(constexpr placeholder() {}
)然后它可以工作,但构造函数不会被评估为constexpr
以及使用_
编译时上下文中的占位符无效(常见的is not a constant expression
错误)。手动调用基本构造函数也是如此。
我的问题是:继承和继承有什么问题constexpr
构造函数?写的时候有没有办法使用继承constexpr
课程?
EDIT:我有一个被零除的错误,使用手动编写的 ctor 的代码工作得很好。另一方面,我不明白为什么继承构造函数或默认构造函数声明都不起作用。问题依然存在。