6

在下面的代码中,如果here()停止存在consteval(完整的 RT 或constexpr),则为insideline()的调用行。但有了它的定义。这种差异从何而来?f()main()constevalf()

#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();
}

螺栓链接

4

1 回答 1

0

以下是我的理解:

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

#include <iostream>

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

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

int main()
{
   foo();
   foo();
}

见神螺栓

输出是

1
2

这证明count()已经被调用了两次,并且main()身体实际上等效于:

foo(count());
foo(count());

现在让我们回到你的例子。当here()is notconsteval时,您的呼叫f()相当于f(here())which 反过来相当于f(here(std::experimental::source_location::current())),这将返回呼叫的行f(),即 is 17

但是,如果here()is consteval,当编译器读取 的声明时f(),它必须立即评估here()which 返回某个此时std::experimental::source_locationline()等于10default_location为了解释的目的我们称之为),因此当您调用 时f(),默认参数已经被评估为default_location, 并且调用实际上等价于f(default_location)

于 2020-07-01T14:09:21.620 回答