【发布时间】:2020-10-15 12:41:12
【问题描述】:
#include <variant>
struct S {
constexpr auto f() -> void {
// deleting the next line creates an error
if(std::holds_alternative<int>(m_var))
m_var.emplace<double>(5.0);
}
std::variant<int, double> m_var;
};
int main() {
return 0;
}
std::variant 有一个非constexpr 成员函数emplace()。一般来说,您不能在 constexpr 函数中使用它。但是,如果您通过在该类型上使用 std::holds_alternative() 的条件包围该调用,则可以。还有其他 constexpr 函数,只要它们是该类中的成员函数。
我很难理解发生了什么。我的第一反应是说这是一个错误。这个条件不可能比没有条件更 constexpr。但也许这还为时过早。任何人都可以对此有所了解吗?为什么emplace() 不是 constexpr 而(相等类型)赋值是?
编辑:也许扩展一下:一种猜测是所涉及的变体的构造函数和析构函数可能是非常数的,这就是为什么emplace 等不是。但有趣的是,即使您明确滥用非 constexpr 构造函数,您也可以使用这样的条件将函数编译为 constexpr。这使该论点无效。
天箭:here.
【问题讨论】: