Должен ли экспорт класса иметь значение?

class __declspec(dllexport) DI_1
{
DI_1& operator = (DI_1 &){};
};

class DI_2
{
DI_2& operator = (DI_2 &){};
};

int main()
{
DI_1 a;
DI_2 b;
return 0;
}

Следующий код при компиляции с VS 2010/2012 выдает следующую ошибку:

ошибка C4716: ‘DI_1 :: operator =’: должен вернуть значение

в то время как я ожидал, что он вернет ту же ошибку для DI_2 класс тоже.

Эта ошибка компилятора не помечена DI_2 класс тоже как ошибка?

Если нет, кто-нибудь может объяснить причину?

Редактировать:
Я подтвердил с Solaris Compiler, и он выдает ошибку для обоих классов.

2

Решение

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

Тем не менее плохое сообщение об ошибке в несравненной меньшей проблеме, а не в неправильной генерации кода. Каждый разумный разработчик компилятора будет следовать этому правилу. Это объяснение.

постскриптум Во время создания шаблона генерируются только те методы, которые вызываются. Другие методы (и возможные синтаксические ошибки в них) игнорируются. Наоборот, для классов AFAIK обычно все методы генерируются. Я не знаю веских причин для этой асимметрии. Может быть, компилятор MS делает что-то в этом направлении.

0

Другие решения

Других решений пока нет …