Ошибка функции шаблона в clang, но не в gcc - PullRequest
2 голосов
/ 12 февраля 2020

У меня есть следующий код, который имеет шаблонную функцию, которая не вызывается ни в какой момент:

#include <exception>

class MyException : public std::exception {
protected:
        MyException( const char* name, const char* reason = nullptr ){
        }
};

template <typename T>
void doSomething( T& temp ){
        throw MyException( "reason" );
}

int main(int argc, char** argv){
}

При использовании g ++ код компилируется просто отлично, однако при использовании clang компиляция завершается неудачно с следующая ошибка:

$ clang++ -std=c++11 -o clang-test test.cpp
test.cpp:11:8: error: calling a protected constructor of class 'MyException'
        throw MyException( "reason" );
              ^
test.cpp:5:2: note: declared protected here
        MyException( const char* name, const char* reason = nullptr ){
        ^
1 error generated.

Если я вызову функцию doSomething, g ++ затем завершится ошибкой с похожей ошибкой:

test.cpp:11:8: error: ‘MyException::MyException(const char*, const char*)’ is protected within this context

Так что, похоже, g ++ не мешает разобрать Функция шаблона, если она не вызывается, а Clang -. Являются ли g ++ и clang действительными в этом случае (например, это зависит от компилятора / не определено), или один из этих компиляторов не соответствует спецификации?

1 Ответ

1 голос
/ 12 февраля 2020

C ++ 17 [temp.res] / 8 говорит:

Программа некорректна, диагностика не требуется c требуется, если:

  • (8.1) Нельзя создать действительную специализацию для шаблона или подстановки constexpr, если оператор внутри шаблона и шаблона не создан, или
  • [...]
  • (8.3 ) гипотетическое создание шаблона сразу после его определения было бы неправильно сформировано из-за конструкции, которая не зависит от параметра шаблона
  • [...]

В противном случае, Диагностический шаблон c не должен выдаваться для шаблона, для которого может быть создана действительная специализация.

Я никогда не слишком уверен в том, что такое создание экземпляров шаблона, но я думаю, что ваша программа не справляется с обоими 8.1 и 8.3. Каждый экземпляр шаблона будет плохо сформирован из-за сбоя проверки доступа, и нет действительных специализаций (т. Е. Нет T, который делает его действительным).

Таким образом, программа является неправильно сформированным отчетом о недоставке и поэтому ни один компилятор не прослушивается.

...