Почему Вы не можете перегрузить '.' оператор в C++?

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

В нем перечислены 3 опции

  1. Установить сборку в GAC
  2. Использовать файл конфигурации приложения (.config) с тегами
  3. Использовать событие AssemblyResolve [ 114]

Эти параметры, по-видимому, актуальны для сборок .NET Framework. Если ваша сборка - .NET Core, то быстрый гугл придумал , что может помочь . Похоже, что это ядро ​​.NET Core для AssemblyResolve, но я смотрел на него только на 5 секунд.

76
задан skaffman 11 December 2010 в 21:24
поделиться

3 ответа

См. эта кавычка от Bjarne Stroustrup :

Оператор. (точка) могла в принципе быть перегружена с помощью той же техники, как используется для->. Однако выполнение так может привести к вопросам о том, ли предназначена операция для объектной перегрузки. или объект, упомянутый. Например:

class Y {
public:
    void f();
    // ...
};

class X {    // assume that you can overload .
    Y* p;
    Y& operator.() { return *p; }
    void f();
    // ...
};

void g(X& x)
{
    x.f();    // X::f or Y::f or error?
}

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

61
ответ дан T.J. Crowder 24 November 2019 в 11:17
поделиться

Stroustrup сказал, что C++ должен быть расширяемым, но не изменяемый язык.

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

Видят Дизайн и Эволюция C++ , страница 242, разделяют 11.5.2 Умных Ссылок .

, Когда я решил позволить перегружаться оператора ->, я естественно рассмотрел, мог ли оператор . быть так же перегружен.

В то время, я считал следующие аргументы окончательными: Если obj объект класса затем obj.m, имеет значение для каждого участника m из класса того объекта. Мы пытаемся не сделать язык изменяемым путем переопределения встроенных операций (хотя то правило нарушено для = из страшной потребности, и для унарного &).

, Если бы мы позволили перегружаться . для класса X, мы не могли бы получить доступ к членам X лет нормальными средствами; мы должны были бы использовать указатель и ->, но -> и &, возможно, также был переопределен. Я хотел расширяемый язык, не изменяемый.

Эти аргументы тяжелы, но не окончательны. В частности, в 1990 Jim Adcock предложил позволить перегружаться оператора . точно способ, которым оператор ->.

"I" в этой кавычке является Bjarne Stroustrup. Вы не можете быть более авторитетными, чем это.

, Если Вы хотите действительно понять C++ (как в, "почему это - этот путь"), необходимо ли абсолютно прочитать эту книгу.

51
ответ дан leemes 24 November 2019 в 11:17
поделиться

Stroustrup имеет ответ для этого вопроса :

Оператор. (точка) могла в принципе быть перегружена с помощью той же техники, как используется для->. Однако выполнение так может привести к вопросам о том, ли предназначена операция для объектной перегрузки. или объект, упомянутый. Например:

class Y {
public:
    void f();
    // ...
};
class X {   // assume that you can overload .
    Y* p;
    Y& operator.() { return *p; }
    void f();
    // ...
};
void g(X& x)
{
    x.f();  // X::f or Y::f or error?
}

Эта проблема может быть решена несколькими способами. Во время стандартизации это не было очевидно, какой способ будет лучшим. Для получения дополнительной информации см. D& E.

28
ответ дан TemplateRex 24 November 2019 в 11:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: