LINUX.ORG.RU

вопрос по C++

 


0

1
#include <iostream>
using namespace std;

class X{
public:
	X(){}
	X(int){}
	int test(){return 1;}
};

int main(int argc, char const *argv[]){
	X x1 = X(1);
	X x2(1);
	X x3 = X();
	X x4();
	cout << x1.test();
	cout << x2.test();
	cout << x3.test();
	cout << x4.test();
	return 0;
}

X4.test() при компиляции выдает

error: request for member ‘test’ in ‘x4’, which is of non-class type ‘X()’
Почему? разве X x4(); не сокращенная форма X x3 = X();?

★★★★★

X x4;

Это default initialization. Если бы X не был бы классом, то в этом случае он был бы не инициализирован.

X x3 = X();

Это copy initialization. В этом случае ещё вызывается конструктор копирования или перемещения. Кроме того, если бы X не был бы классом, то в этом случае он был бы инициализирован нулём.

Begemoth ★★★★★ ()
Ответ на: комментарий от EXL

Нет, в С++98/03 придётся писать T x = T() и надеяться на то, что компилятор соптимизирует копирование. Или использовать value_initialized из Boost'а (или свелосипедить аналог).

Begemoth ★★★★★ ()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от Begemoth

1) там это называют value initialization
2) получается value initialization это крайний случай list initialization?
3) чем тогда принципиально list initialization отличается от direct initialization?
4) почему в С++ все так запутано?

TDrive ★★★★★ ()
Последнее исправление: TDrive (всего исправлений: 1)
Ответ на: комментарий от TDrive

4) почему в С++ все так запутано?

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

ilammy ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.