Почему члены класса не могут быть инициализированы с помощью синтаксиса прямой инициализации?

c++ initialization language-lawyer

518 просмотра

1 ответ

7249 Репутация автора

Мне интересно знать, почему члены класса не могут быть инициализированы с использованием синтаксиса ()? Рассмотрим следующий пример:

#include <iostream>
class test
{
    public:
        void fun()
        {
            int a(3);
            std::cout<<a<<'\n';
        }
    private:
        int s(3);    // Compiler error why???
};
int main()
{
    test t;
    t.fun();
    return 0;
}

Программа не скомпилируется и выдает следующие ошибки.

11  9 [Error] expected identifier before numeric constant

11  9 [Error] expected ',' or '...' before numeric constant

Почему? Какова причина? Что стандарт C ++ говорит об инициализации членов данных класса? Ваша помощь очень ценится. Спасибо

Автор: Destructor Источник Размещён: 24.02.2015 01:05

Ответы (1)


11 плюса

320616 Репутация автора

Решение

Ранние предложения, приведшие к введению этой функции, объясняют, что это необходимо для избежания проблем с анализом .

Вот только один из примеров, представленных в нем:

К сожалению, это делает инициализаторы формы « ( expression-list ) » неоднозначными во время анализа объявления:

struct S {
    int i(x); // data member with initializer
    // ...
    static int x;
};

struct T {
    int i(x); // member function declaration
    // ...
    typedef int x;
};

Одно из возможных решений - полагаться на существующее правило: если объявление может быть объектом или функцией, то это функция:

struct S {
    int i(j); // ill-formed...parsed as a member function,
              // type j looked up but not found
    // ...
    static int j;
};

Аналогичным решением было бы применить другое существующее правило, которое в настоящее время используется только в шаблонах, что, если это Tможет быть тип или что-то еще, то это что-то другое; и мы можем использовать « typename», если мы действительно подразумеваем тип:

struct S {
    int i(x); // unabmiguously a data member
    int j(typename y); // unabmiguously a member function
};

Оба этих решения обладают тонкостями, которые могут быть неправильно поняты многими пользователями (о чем свидетельствует множество вопросов на comp.lang.c ++ о том, почему « int i();» в области видимости блока не объявляет инициализированный по умолчанию int).

Решение, предложенное в этой статье, состоит в том, чтобы разрешить только инициализаторы форм « = initializer-clause » и « { initializer-list } ». Это решает проблему неоднозначности в большинстве случаев. [..]

Автор: Lightness Races with Monica Размещён: 24.02.2015 01:11
Вопросы из категории :
32x32