Расположение источника на месте вызова и ntps: странные результаты и возможная ошибка компилятора?
Рассмотрим следующий код, который используетsource_location
:
// Preamble
#include <iostream>
#include <source_location>
// Using a function
constexpr std::size_t function(
std::size_t line = std::source_location::current().line()
) noexcept {return line;}
// Using a constructor
struct construction {
constexpr construction(
std::size_t input = std::source_location::current().line()
) noexcept: line{input} {}
std::size_t line;
};
// Using a template deduction guide
template <std::size_t Line>
struct wrapper {
static constexpr std::size_t line = Line;
};
template <std::size_t index = std::source_location::current().line()>
wrapper() -> wrapper<index>;
// Main
int main(int argc, char* argv[]) {
std::size_t f1 = function();
std::size_t f2 = function();
std::size_t c1 = construction().line;
std::size_t c2 = construction().line;
std::size_t w1 = wrapper().line;
std::size_t w2 = wrapper().line;
std::cout << f1 << " " << f2 << std::endl;
std::cout << c1 << " " << c2 << std::endl;
std::cout << w1 << " " << w2 << std::endl;
return 0;
}
Он производит следующий вывод:
// GCC 12.2
28 29 // NOT EQUAL
30 31 // NOT EQUAL
23 23 // EQUAL
// CLANG 15.0
7 7 // EQUAL
13 13 // EQUAL
23 23 // EQUAL
ВОПРОС:
- Каким должен быть правильный результат по стандарту (в частности в случае обертки?)