我在 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。