gpt4 book ai didi

c++ - consteval 如何影响默认参数的评估?

转载 作者:行者123 更新时间:2023-12-01 13:09:08 26 4
gpt4 key购买 nike

在下面的代码中,如果 here()不再是 consteval (完整的 RT 或 constexpr ),然后是 line()f() 的调用行里面 main() .但与 consteval这是f()的定义.这种差异从何而来?

#include <experimental/source_location>
#include <iostream>

consteval std::experimental::source_location here(
std::experimental::source_location loc = std::experimental::source_location::current())
{
return loc;
}

void f(const std::experimental::source_location& a = here())
{
std::cout << a.line() << std::endl; // will either print 17, or 10
}

int main()
{
f();
}
Godbolt link

最佳答案

以下是我的理解:
默认参数在调用站点替换并在每次调用时进行评估。
请参阅以下代码作为示例:

#include <iostream>

int count() {
static int counter = 0;
return ++counter;
}

void foo(int value = count())
{
std::cout << value << "\n";
}

int main()
{
foo();
foo();
}
See in godbolt
输出是
1
2
这证明了 count()已被调用两次, main() body 等效于:
foo(count());
foo(count());

现在让我们回到你的例子。当 here()不是 consteval ,然后您调用 f()相当于 f(here())这又相当于 f(here(std::experimental::source_location::current()))这会将调用的行返回到 f() ,即 17 .
但是,如果 here()consteval ,当编译器读取 f() 的声明时,它必须立即评估 here()返回某个 std::experimental::source_location谁的 line()等于 10在这一点上(我们称它为 default_location 以方便解释),因此当您调用 f() 时,默认参数已经评估为 default_location , 并且调用实际上等价于 f(default_location)

关于c++ - consteval 如何影响默认参数的评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62638496/

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