почему стандарт запрещает "virtual void funcFoo () = 0 {}"? - PullRequest
0 голосов
/ 20 апреля 2011

[ Я не мог найти правильный ответ на это.Пожалуйста, укажите мне правильные ссылки, если на это уже есть ответ. ]

Я знаю, что делать что-то подобное незаконно,

class Base
{
public:
    virtual void funcFoo() = 0 {}   //illegal. should be defined outside the class body
    virtual ~Base() {}
};

Но на VS2008 это прекрасно работает.Я хочу знать, почему это запрещено стандартом?

На андроиде я вижу, что я должен определить функцию inline следующим образом,

inline void Base::funcFoo() {}

вместо просто,

void Base::funcFoo() {}

В чем отличие неявного и явного встраивания?чем отличается компилятор?

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

Это неправильно сформировано в соответствии с разделом §10.4 / 2, в котором говорится (в примечании), что

объявление функции не может обеспечить ни чистый спецификатор, ни определение

[Example:

struct C {
   virtual void f() = 0 { }; // ill-formed
};

—end example]

Надеюсь, что он отвечает на ваш вопрос.

Теперь, пожалуйста, обратитесь к первому комментарию (ниже), сделанному @John Dibling, к сожалению, к ответу на ваш вопрос "почему?"«Вопрос не в Стандарте, ЕСЛИ "that is ill-formed" не является приемлемым для вас ответом.Языковая грамматика просто не позволяет этого. :-)

1 голос
/ 20 апреля 2011

Я не думаю, что есть большой ответ на это. Это появилось однажды (возможно, на Usenet вместо SO - я не помню), поэтому я немного посмотрел. Я действительно ничего не придумал. Насколько я могу судить, именно так Бьярне и придумал это. Хотя это можно было изменить, я не смог найти ни каких-либо предложений для комитета по его изменению, ни каких-либо указаний на то, что комитет даже обсуждал, обсуждал или рассматривал это вообще. Я полагаю, что он считается «достаточно хорошим» таким, каким он есть, поэтому никто не желает приложить много (каких-либо усилий), чтобы изменить его.

0 голосов
/ 20 апреля 2011

На первый вопрос уже дан ответ - стандарт просто запрещает его.

Второй вопрос:

На Android я вижу, что я должен определить функцию inlineвот так,

inline void Base::funcFoo() {}

вместо просто,

void Base::funcFoo() {}

В чем здесь разница в неявном и явном встраивании?чем отличается компилятор?

Разница в том, что первый вариант может быть помещен в заголовочный файл, который может быть включен более чем одним исходным файлом.Второй вариант должен быть размещен ровно в одном исходном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...