gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:19:08 25 4
gpt4 key购买 nike

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

constexpr example::example(const int &n);
我的问题是:如果我随后定义函数
void foo(example n);
我像这样使用它
foo(3);
在我的代码中,是整数文字 3example 的实例中转换在编译时?
如果没有,有没有办法获得这种行为?
如果是,如果构造函数没有显式声明为 constexpr,这仍然会发生吗? ?

最佳答案

构造函数是constexpr的事实不强制计算在编译时发生。这只意味着构造函数有资格在常量表达式和非常量表达式中使用。
另一方面,如果您声明了构造函数 consteval ,那么这意味着只允许常量表达式调用该构造函数。这反过来意味着构造函数的每次调用都必须由编译器检查以确保它是一个常量表达式(因为如果不是,编译器必须诊断违规)。由于检查某个东西是一个常量表达式需要检查它是否包含任何未定义的行为,因此这种检查与实际评估表达式一样困难。因此,您可以放心,声明一个构造函数(或任何其他函数)consteval将确保不会在运行时调用该函数:允许编译器生成代码以在运行时重新评估它,但没有理由这样做。这种方法的缺点是,首先,不可能在非常量表达式中使用构造函数,其次,常量表达式计算比运行时计算慢得多,您必须决定增加的编译时间是否值得.
如果您将构造函数保留为 constexpr那么您仍然可以通过使用 constexpr 在特定情况下强制在编译时调用它多变的:

constexpr example ex = 3;  // evaluated at compile time
foo(ex);
这是事实的结果 constexpr变量只允许由常量表达式初始化。

关于c++ - 文字到类类型的隐式转换是否发生在编译时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67325010/

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