2015-06-25 4 views
4

Я искал какой-то пост о объявлении виртуальной функции, уверовавшиеПочему виртуальный void test() = 00 действителен, но действительный void test() = + 0 и действительный void test() = - 0 недействителен?

=0 

в

virtual void test()=0; 

фиксируется Синтекс так

virtual void test()=NULL; 
virtual void test()=false; 
virtual void test()=1-1; 
virtual void test()=0.0; 

и другие заявления, не должны быть действительными.

, но я нашел

virtual void test()=00; 
virtual void test()=000; 
virtual void test()=0000; 

может также компилировать, почему?

, а также, я думаю, что число +0 и -0 фактически такой же, как 0 (я не уверен, если это правильно), так же, как на самом деле 00 0, почему

virtual void test()=+0; 

и

virtual void test()=-0; 

не удалось скомпилировать?

+1

Если '= 00;' компилируется, напишите ошибку разработчикам вашего компилятора. –

+0

Очень похоже на [Чистые виртуальные функции в C++ 11] (http://stackoverflow.com/q/20861346/1708801) –

+0

gcc 4.9.2 правильно сообщает «ошибка: недействительный чистый спецификатор (разрешено только« = 0 ») до ';' лексема». – TonyK

ответ

4

От November 2014 working draft стандарта:

10.4:

A virtual function is specified pure by using a pure-specifier (9.2) in the function declaration in the class definition.

В 9.2 мы видим, определение "чистого спецификатора":

pure-specifier: = 0

Это показывает, что ваши примеры не следует компилировать, как вы ожидаете, и как таковой вы должны отправить отчет об ошибке своему производителю компилятора.

4

чисто спецификатор является точной последовательностью маркеров = 0 - две фишки, = и 0, в таком порядке.

Никакой другой токен не допускается. Компилятор, который принимает =00 без (по крайней мере), предупреждение является несоответствующим.

0

На мой взгляд, это просто потому, что компилятор (или некоторый процесс предварительной компиляции) заменяет множество нулей одним нолем. Excel и Calc.exe, например, заменяет 0000 на 0.

Смежные вопросы