gpt4 book ai didi

c++ - 可以在 constexpr 构造函数(C++14)中修改非静态成员变量吗?

转载 作者:可可西里 更新时间:2023-11-01 16:40:40 26 4
gpt4 key购买 nike

struct A {
int a = 0;
constexpr A() { a = 1; }
};

constexpr bool f() {
constexpr A a;
static_assert(a.a == 1, ""); // L1: OK
return a.a == 1;
}
static_assert(f(), ""); // L2: Error, can not modify A::a in constexpr

如果我删除 L2,这段代码可以编译。如果我添加 L2,编译器会提示“在常量表达式中不允许修改 const 限定类型‘const int’的对象”。我不是语言律师,所以我不确定这是否属实。但是,如果是,为什么编译器没有提示 L1 的任何问题,因为它也将 A() 称为 constexpr?这是clang的错误吗?还是我错过了什么?

引用:http://en.cppreference.com/w/cpp/language/constexpr

顺便说一句,如果我更改“constexpr A a;”到“一个;” (删除 constexpr 关键字),L1 无法编译,这是预期的。但是,编译器不再提示 L2。

关于此的在线编译器 URL:http://goo.gl/AoTzYx

最佳答案

我相信这只是编译器没有跟上为 C++14 提议的更改的一个例子。您的 constexpr 构造函数满足 N3936 的 §7.1.5/4 中列出的所有条件。 .两者 gcc and clang fail to compile您的代码,但出于不同的原因。

clang 提示:

note: modification of object of const-qualified type 'const int' is not allowed in a constant expression

这没有多大意义,但让我想起了 C++11 的限制,即 constexpr 成员函数隐式为 const(这是一个构造函数,不适用,但错误消息让人想起那个)。 C++14 也取消了此限制。

gcc 的错误信息是:

error: constexpr constructor does not have empty body

很明显 gcc 仍然为 constexpr 构造函数实现 C++11 规则。

此外,N3597列出这个例子:

struct override_raii {
constexpr override_raii(int &a, int v) : a(a), old(a) {
a = v;
}
constexpr ~override_raii() {
a = old;
}
int &a, old;
};

N3597 已被 N3652 取代,其中包含当前草案中的措辞。不幸的是,前面的示例消失了,但是,当前的措辞中没有任何内容表明您不能在 constexpr 构造函数的主体内为数据成员赋值。

更新 (2017-10-03)

clang 修复了这个问题,但还没有新版本:https://bugs.llvm.org/show_bug.cgi?id=19741( Compiler explorer )

关于c++ - 可以在 constexpr 构造函数(C++14)中修改非静态成员变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23647492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com