Здравствуйте, niralex, Вы писали:
N>N>#include <iostream>
N>#include <array>
N>using namespace std;
N>template<const int *ptr>
N>constexpr const int *Test()
N>{
N> return ptr + 1;
N>}
N>constexpr array<int, 3> ar{1, 2, 3};
N>int main()
N>{
N> // clang version 15.0.7 - Compile Error!
N> // gcc 12.2.0 - ok!!
N> constexpr auto x = Test<ar.data()>(); // 1
N> cout << *x << endl;
N> return 0;
N>}
N>
N>Компилятор clang выдает маловразумительные сообщения:
N>main.cpp|18|error: no matching function for call to 'Test'|
N>main.cpp|7|note: candidate template ignored: invalid explicitly-specified argument for template parameter 'ptr'|
N>Как можно минимально поправить код, чтобы и clang и gcc компилировали?
Не готов диагностировать точно, но думаю, что здесь что-то вокруг типа связывания (linkage). По стандарту параметром шаблона может быть указатель только на данные с внешним связыванием. Похоже, что ar.data() имеет разный тип связывания в clang и в gcc.