文字到类类型的隐式转换是否发生在编译时?

The*_*e42 5 c++

我正在尝试编写一个与整数密切相关的类,因此我在表单中包含了一个转换构造函数

constexpr example::example(const int &n);
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果我随后定义函数

void foo(example n);
Run Code Online (Sandbox Code Playgroud)

我像这样使用它

foo(3);
Run Code Online (Sandbox Code Playgroud)

在我的代码中,整数文字3是否example在编译时在 的实例中转换?

如果没有,有没有办法获得这种行为?

如果是,如果构造函数没有显式声明为,那还会发生constexpr吗?

Bri*_*ian 4

构造函数的事实constexpr并不强制计算在编译时发生。它仅意味着构造函数可以在常量表达式和非常量表达式中使用。

另一方面,如果您声明构造函数consteval,则意味着允许常量表达式调用该构造函数。这反过来意味着编译器必须检查构造函数的每次调用,以确保它是常量表达式(因为,如果不是,编译器必须诊断违规)。由于检查某事物是否为常量表达式需要检查它是否包含任何未定义的行为,因此这种检查与实际评估表达式一样困难。因此,您可以放心,声明构造函数(或任何其他函数)consteval将确保该函数不会在运行时被调用:允许编译器生成代码以在运行时重新评估它,但没有理由这样做会这样做的。这种方法的缺点是,首先,不可能在非常量表达式中使用构造函数,其次,常量表达式求值比运行时求值慢得多,您必须决定增加的编译时间是否值得。

如果您保留构造函数,那么您仍然可以通过使用变量强制在编译时在特定实例中constexpr调用它:constexpr

constexpr example ex = 3;  // evaluated at compile time
foo(ex);
Run Code Online (Sandbox Code Playgroud)

constexpr这是由于变量只允许由常量表达式初始化的结果。