Проблемы с конструктором 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 (*)())’

Спасибо!

1

Решение

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

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

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

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

Другие решения

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

1

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

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

1
По вопросам рекламы [email protected]