Re: Почему clang не компилирует этот код в отличии от gcc
От: rg45 СССР  
Дата: 18.03.23 17:57
Оценка:
Здравствуйте, 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.
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.