我在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。
2条答案
按热度按时间sf6xfgos1#
source_location::current()
* 总是 * 给你调用它的确切位置。观察到的行为正是它应该如何工作的。默认的函数参数在调用点求值。这就是为什么第二个例子中的第一个调用返回“13”。这也是在函数调用中使用
source_location
的唯一方法(否则就没什么意义了)。rvpgvaaj2#
我发现第二个变体是正确的。在目前的GCC 12上它工作得很好。