Интересно, может ли кто-нибудь помочь с тем, что мне кажется странным в 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 (*)())’
Спасибо!
Вы никогда не объявляете объект вообще. Вместо этого вы объявили функция, и поэтому не нужен конструктор вообще. (Обратите внимание, что ClassB()
обозначает тип функции!)
Если вы хотите построить объект из временного, попробуйте один из этих синтаксисов:
ClassA x1 { ClassB{} }; // C++11 only
ClassA x2((ClassB())); // parenthesized expression is never a type declaration
ClassA myClassA(ClassB());
объявляет функция называется myClassA
который возвращает ClassA
и принимает один аргумент, который является указателем на функцию, которая возвращает ClassB
и не принимает никаких аргументов. Это самый неприятный разбор.
Это ситуация, которая называется «Самый неприятный разбор».
Первый и формость, ClassB
делает есть конструктор. Когда вы не создаете свой собственный, компилятор предоставляет его вам. И на линии, где вы передали экземпляр ClassB
в то, что кажется допустимой конструкцией копии, на самом деле происходит то, что строка оценивается как объявление функции, которая возвращает экземпляр ClassA
и принимает анонимный экземпляр ClassB
,