当前位置: 首页 > 知识库问答 >
问题:

这是一个错误吗?Constexpr 构造函数静默地变为非 constexpr

韩英锐
2023-03-14

看看这段代码:

struct NonConstexpr {
    NonConstexpr() { }
};

template <typename T>
struct Bar {
    NonConstexpr nonConstexpr;

    constexpr Bar() { }
};

struct Foo {
    Bar<void> bar;

    constexpr Foo() { }
};

< code>Foo有一个成员< code > Foo::bar::nonConstexpr ,它有一个非Constexpr构造函数。所以,我的期望是,这不应该编译。但是它用gcc,clang和msvc编译。这是编译器的bug,还是某个规则允许这段代码编译?

如果我直接将 Nonconsexpr 成员添加Foo 中,代码将不再编译。

(我遇到了这个问题,因为我期望对全局Foo对象进行静态初始化,但它得到了动态初始化,并且由于“静态初始化顺序惨败”而引起了问题)

共有1个答案

卜弘文
2023-03-14

这是一个编译器错误,还是某些规则允许编译此代码?

允许编译的规则是:

10.1.5 constexpr指定符[dcl.constexpr]

6.如果constexpr函数模板或类模板的成员函数的实例化模板专用化无法满足constexprfunction或constexpr构造函数的要求,这种特殊化仍然是一个constexpr函数或constexpr构造函数,即使对这种函数的调用不能出现在常量表达式中。如果将模板作为非模板函数或构造函数时,模板的任何专门化都不能满足constexpr函数或constexpr构造函数的要求,则模板格式不正确,不需要诊断。

以上引用摘自CPP标准草案N4713。

从引用中可能不清楚Bar

 类似资料:
  • 联机编译器URL:http://goo.gl/jni6Em 编译器:clang 3.4(带有-std=c 1y) 系统:Linux 3.2 如果删除L2,则编译此代码。如果我添加L2,编译器会抱怨“常量表达式中不允许修改常量限定类型‘const int‘的对象”。我不是语言律师,所以我不确定这是否属实。然而,若确实如此,为什么编译器并没有抱怨L1,因为它也将A()作为constexpr调用?这是叮

  • 我正在尝试编译以下C代码(另存为example4.cpp) 此代码给出以下错误: example4.cpp:在函数'Conconexpr double nth(double, int)':example4.cpp:24: 9: error:调用非Conconexpr函数'std::basic_ostream 谁能推荐一下吗? 谢谢你。

  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • 问题内容: 按照标准书,构造函数是用于初始化对象的一种特殊类型的函数。由于构造函数被定义为一个函数,并且内部类函数只能具有两种类型的静态或非静态类型。我怀疑是什么构造函数? 我的疑问是如果构造函数是静态方法,那么我们如何在构造函数内部频繁使用此方法 输出是否意味着构造函数是非静态的? 问题答案: 您的第二个例子很重要。引用在构造函数中可用,这意味着构造函数是针对某个对象(当前正在创建的对象)执行的

  • 我有一个任务,我需要添加2个构造函数,并从中分离出来,还列出了变异子。然而,我认为大多数构造函数都是变种人:正如本文所示。所以我很困惑,对于变异子方法,我需要做什么?目前,我为施工人员提供以下服务: 根据评论: 以下是我尝试过的,但它会导致以下错误 PrintStream类型中的print(布尔)方法不适用于参数(void) 在这条主线上: 方法如下:

  • 问题内容: 我有一些简单的Java代码,其结构与此类似: 我将有很多的子类,每个子类以自己的方式(模板方法模式)实现方法。 这很好用,但是我不喜欢子类中有多余的构造函数。输入更多,难以维护。如果要更改构造函数的方法签名,则必须更改所有子类。 当我从子类中删除构造函数时,出现此编译时错误: 我想做的事可能吗? 问题答案: 你会收到此错误,因为没有构造函数的类具有默认构造函数,该构造函数没有参数,并且