Рассмотрим этот конструктор копирования шаблона класса, который имеет ошибку:
MyClass( MyClass const& other )
: m_x( other.n_x ) // typo: should be `other.m_x`.
{
// does something
}
Или эту перегрузку оператора присваивания копии, которая ничего не возвращает (return-type
предупреждение):
MyClass& operator=( MyClass const& other )
{
// does something
// WARNING: with no `return *this`.
}
Несколько раз случалось, что G CC сначала компилирует код без каких-либо ошибок / предупреждений, а позже, после некоторых изменений в других частях кода, он жалуется на проблему, которая уже была там (в основном в конструкторах или Насколько я помню, операторы присваивания).
Игнорирует ли G CC функции шаблона или функции-члены класса шаблона, которые не создаются полностью во всем коде? Что происходит под капотом?
Я использую G CC 9.3 и G CC 10.1 с -O3 -Wall -Wpedantic -Werror
.
UPDATE Как предложил @someprogrammerdude, вот минимальный воспроизводимый пример:
template< typename T >
class MyClass {
public:
MyClass( T x ) : m_x( x ) { };
MyClass( MyClass const& other )
: m_x( other.n_x )
{
std::cout << "in copy constructor" << std::endl;
}
MyClass& operator=( MyClass const& other )
{
this->m_x = other.m_x;
}
T m_x;
};
и вот пример использования, который компилируется как есть. Но раскомментирование некоторых частей дает ошибку или предупреждение.
int main()
{
MyClass< int > c( 2 );
std::cout << c.m_x << std::endl;
/* Uncommenting these lines gives an error in constructor.
* error: ‘const class MyClass<int>’ has no member named ‘n_x’*/
//MyClass< int > d = c;
//std::cout << d.m_x << std::endl;
/* Uncommenting these lines gives a warning in copy assignment operator.
* error: no return statement in function returning non-void [-Werror=return-type] */
//MyClass< int > d( 3 );
//d = c;
//std::cout << d.m_x << std::endl;
return 0;
}
Теперь, когда я создал этот пример, мне стало понятнее. Итак, не было бы никакой проверки, если бы она не была создана?