Проблемы с конструктором C++

Интересно, может ли кто-нибудь помочь с тем, что мне кажется странным в c++ (gcc Последняя версия). Ниже приведен код, который успешно компилируется, и я ожидаю ошибки времени компиляции из-за отсутствия соответствующего конструктора. Кто-нибудь может объяснить, что происходит?

#include <iostream>
using namespace std;

struct ClassA {
  ClassA() {cout << "hello" << endl;} 
  void speak() {cout << "I am class A" << endl;}
  ~ClassA() {cout << "goodbye" << endl;} 
};

struct ClassB {
    // just an empty struct
};

int main() {
    ClassA myClassA(ClassB()); // trying to construct class A from an rvalue reference to class B is ok?
    return 0;
}

}

Если я попытаюсь вызвать функцию class AЯ получаю ошибку времени компиляции:

int main() {
    ClassA myClassA(ClassB());
    myClassA.speak();
    return 0;
}

результаты в:

error: request for member ‘speak’ in ‘myClassA', which is of non-class type ‘ClassA(ClassB (*)())’

Спасибо!

3 ответа

Решение

Вы никогда не объявляете объект вообще. Вместо этого вы объявили функцию, поэтому конструктор вообще не нужен. (Обратите внимание, что ClassB() обозначает тип функции!)

Если вы хотите построить объект из временного, попробуйте один из этих синтаксисов:

ClassA x1 { ClassB{} };   // C++11 only

ClassA x2((ClassB()));    // parenthesized expression is never a type declaration

Это ситуация, которая называется "Самый неприятный разбор".

Первый и формость, ClassB есть конструктор. Когда вы не создаете свой собственный, компилятор предоставляет его вам. И на линии, где вы передали экземпляр ClassB в то, что кажется допустимой конструкцией копии, на самом деле происходит то, что строка оценивается как объявление функции, которая возвращает экземпляр ClassA и принимает анонимный экземпляр ClassB,

ClassA myClassA(ClassB()); объявляет функцию с именем myClassA который возвращает ClassA и принимает один аргумент, который является указателем на функцию, которая возвращает ClassB и не принимает никаких аргументов. Это самый неприятный разбор.

Другие вопросы по тегам