Расположение источника на месте вызова и 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

ВОПРОС:

  • Каким должен быть правильный результат по стандарту (в частности в случае обертки?)

0 ответов

Другие вопросы по тегам