Следующий код компилирует на широком диапазоне НКУ и лязг версий - при компиляции и запуска с GCC 5.3.1, он печатаетПочему gcc и clang позволяют мне создавать абстрактный класс?
A()
затем прерывается с чистой ошибки виртуального вызова.
#include <stdio.h>
class A
{
public:
A() {
printf("A()\n");
}
virtual void b() const = 0;
};
int main()
{
const A& a{};
a.b();
return 0;
}
Я понимаю, что связывание ссылки на временном не является идеальным (хотя я думаю этот случай покрываются каким-то продление срока эксплуатации) - но он также работает при попытке вызвать метод, который принимает константный ссылка как:
Foo({});
Для удобства здесь приведен пример его составления с лязгом 3.2: Compiler Explorer
Построение абстрактного класса с помощью указателя или ссылки разрешено, помните? – DeiDei
@DeiDei Я этого не помню, но это объясняло бы почему. РЕДАКТИРОВАТЬ: Чтобы быть ясным, на самом деле он создает объект, а не только ссылку. – Matt
«вид продления жизни» - жизнь заканчивается на завершающей стадии - так что на ';' - но поскольку ничего больше не происходит, вы просто продолжаете с неопределенным поведением. – Soren