синтаксис getw 80 - инициализация в списке параметров - PullRequest
1 голос
/ 01 ноября 2011

Gotw 80 включает в себя следующий пример:

  // Example 1
  //
  #include <string>
  using namespace std;

  class A
  {
  public:
    A( const string& s ) { /* ... */ }
    string f() { return "hello, world"; }
  };

  class B : public A
  {
  public:
    B() : A( s = f() ) {}
  private:
    string s;
  };

  int main()
  {
    B b;
  }

В статье обсуждается, почему строка s = f() неверна - из-за времени жизни объекта и порядка строительства. В статье говорится, что в то время ошибка не была обнаружена компилятором.

Однако, игнорируя проблемы порядка инициализации и времени жизни объекта, я не вижу, как s = f() в списке параметров конструктора может быть синтаксически допустимым - похоже, он пытается инициализировать член в списке параметров (или, возможно, объявление значения по умолчанию). Кто-нибудь может объяснить, что пытается делать этот синтаксис?

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Похоже, намеревался вызвать f() и присвоить результат B::s.После этого результат этого присваивания (равный s) будет использоваться в качестве фактического параметра при вызове унаследованного конструктора A.

Это синтаксически допустимо.Замените s в этом выражении на некоторую переменную, не являющуюся членом, и g ++ принимает ее без проблем .Может показаться, что подобный синтаксис чаще используется с обычными вызовами функций вместо вызовов конструктора.

1 голос
/ 01 ноября 2011

Синтаксически это допустимо ... когда у вас есть базовый класс с конструктором, который принимает аргументы, вы, конечно, можете передать любое выражение в качестве параметра:

strut A {
    A(int) {}
};

struct B : A {
    B() : A( any expression that returns an int ) {}
};

Проблема в том, что при оценке выражения в примере объект даже не является полностью построенным экземпляром A, поэтому код является недействительным по двум причинам:

  1. Вызывает метод A неэкземпляра (конструктор еще не запущен): f() вызов недопустим.
  2. Назначает члену, который не был инициализирован: s=... недопустим.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...