У меня есть следующий код, который имеет шаблонную функцию, которая не вызывается ни в какой момент:
#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 действительными в этом случае (например, это зависит от компилятора / не определено), или один из этих компиляторов не соответствует спецификации?