具有未初始化成员的struct的constexpr默认构造函数仅在模板化时有效

时间:2016-05-16 02:22:37

标签: c++ templates default constexpr c++17

当且仅当结构是模板时,似乎允许我使用未初始化的成员显式默认constexpr默认构造函数。即使模板结构被实例化也是如此。

这是对的吗?

示例:

struct SFoo
  {
    constexpr SFoo() =default; // disallowed
    int x;
  };

template <typename tTYPE>
struct SBar
  {
    constexpr SBar() =default; // accepted
    int x;
  };

int main(int argc, char const* const argv[])
  {
    SBar<int> bar; // also accepted
    constexpr SBar<int> bar2; // disallowed (correctly)

    return 0;
  }

LLVM输出:

3:3: error: defaulted definition of default constructor is not constexpr
constexpr SFoo() =default;

LLVM和GCC都拒绝SFoo并接受SBar

1 个答案:

答案 0 :(得分:0)

  

当且仅当

让我告诉你数学家的答案。没有。试图将IIF应用于1300页文档是NP难题。

  

这是对的吗?

你的程序无论如何都是无效的。

  

[dcl.init / 7]如果一个程序要求默认初始化一个   const限定类型T的对象,T应为具有a的类类型   用户提供的默认构造函数。

无论是否是模板都无关紧要。