2

我在 C++20 模式下使用 GCC10 尝试了以下第一个变体:

consteval std::experimental::source_location there()
{
   return std::experimental::source_location::current(); // Line 3
}

void f(const std::experimental::source_location& a = there()) // Line 6
{
   std::cout << a.line() << std::endl;
}

int main(int pArgc, char* pArgv[])
{
   std::cout << there().line() << std::endl; // Line 13
   f(); // Line 14

   return 0;
}

我期望以下输出:

13
14

但我得到了:

3
3

然后我尝试了以下第二个变体:

consteval std::experimental::source_location there(const std::experimental::source_location& a = std::experimental::source_location::current())
{
   return a; // Line 3
}

void f(const std::experimental::source_location& a = there()) // Line 6
{
   std::cout << a.line() << std::endl;
}

我期望以下输出:

13
14

但我得到了:

13
6

为什么代码会这样?有没有办法让它在不使用预处理器宏的情况下按预期运行?

更新:使用 'constexpr' 或 'inline' 而不是 'consteval' 的第二个变体适用于最新的 GCC。所以剩下的问题是:为什么“consteval”不能正常工作?有人告诉我这不是一个标准问题,而是一个实施主题,所以我将把这个问题重新标记为 GCC。

4

1 回答 1

3

source_location::current() 始终为您提供调用它的确切位置。观察到的行为正是它应该如何工作的。

默认函数参数在调用站点上进行评估。这就是第二个示例中的第一个调用返回“13”的原因。这也是source_location包装在函数调用中时应该使用的唯一方法(否则没有多大意义)。

于 2020-06-28T22:45:05.507 回答