LINUX.ORG.RU
ФорумTalks

g++ vs clang++

 ,


0

3

В некий момент обнаружил, что код, собираемый clang++, не собирается g++:

Вот фрагмент ошибок g++:

man.cc: In constructor ‘a_man::a_man()’:
man.cc:6:19: error: cannot call constructor ‘a_man::a_human’ directly [-fpermissive]
man.cc:6:19: error:   for a function-style cast, remove the redundant ‘::a_human’ [-fpermissive]

Сам код:

vlad-cvs.dyndns-work.com:10000

Соответственно, возникает мысль, что как минимум один из них нарушает стандарт. Либо же стандарт нарушает мой код, но clang понимает его.

вот кусок:

a_man::a_man()
{
        a_human::a_human();
.....

★★★★★

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

Это написано в первой же главе о классах в любой книге по C++. Ты что думаешь, что тебе тут азы будут разжевывать?

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

С таким разнобоем в понимании стандартов компиляторами, я не уверен, что в книге описана действительность

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Плох тем, что так делать нельзя.

Код a_human будет исполняться первым. Если ты в списке инициализации не укажешь явно конструктор базового класса, то неявно вызовется конструктор по умолчанию. Более того, если у тебя объявлен конструктор базового класса с аргументом, но не определён конструктор по умолчанию, и ты не дёргаешь конструктор базового класса явно в списке инициализации, то код у тебя не скомпилируется.

#include <iostream>

class A {
	public:
	A(int) { std::cout << "A" << std::endl; }
};

class B: public A {
	public:
	B()
		: A(0) 
	{ std::cout << "B" << std::endl; }
};

int main() {
	B b;
}

В таком виде это выдаёт:

A
B

Если убрать строчку A(0), то будет так:

test.cpp: In constructor ‘B::B()’:
test.cpp:10:6: error: no matching function for call to ‘A::A()’
test.cpp:10:6: note: candidates are:
test.cpp:5:2: note: A::A(int)
test.cpp:5:2: note:   candidate expects 1 argument, 0 provided
test.cpp:3:7: note: A::A(const A&)
test.cpp:3:7: note:   candidate expects 1 argument, 0 provided

Вообще, ЕМНИП, порядок вызова конструкторов такой: первыми выполняются тела конструкторов виртуальных базовых классов, затем объектов-членов в порядке их объявления в теле класса, затем остальных базовых классов, в последнюю очередь выполняется то, что ты пишешь в {} конструктора. Может я и путаю что-то с утра.

DELIRIUM ☆☆☆☆☆
()
Последнее исправление: DELIRIUM (всего исправлений: 1)

В clang'е решили расширить язык - ололо:) Впилили то, что специально не разрешалось стандартом С++. Остается их только поздравить.

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