Calling pure virtual functions in constructor of base class is UB

Obviously it shouldn’t work as definition of foo() is not available in A()1 , the thing is that it’s UB2 .

#include <iostream>

class A {
public:
  A() {
    std::cout << "A()" << std::endl;
    std::cout << this->foo() << std::endl;
  }
  virtual int foo() = 0;
};

class B : A {
public:
  B() {
    std::cout << "B()" << std::endl;
    std::cout << this->foo() << std::endl;
  }
  int foo() { return 2; }
};

int main(int __attribute__((unused)) argc,
         char __attribute__((unused)) * argv[],
         char __attribute__((unused)) * envp[]) {
  B aux;

  return 0;
}

Compiler throws a warning… and linker throws this error:

[ecomaikgolf@desktop ../testcpp/c3328e227d1cdcfa]$ make run
bear --  g++  -include .utils.h -Wall -Wextra  -o a.out main.cpp
main.cpp: En el constructor ‘A::A()’:
main.cpp:13:27: aviso: pure virtual ‘virtual int A::foo()’ called from constructor
   13 |     std::cout << this->foo() << std::endl;
      |                  ~~~~~~~~~^~
/usr/bin/ld: /tmp/ccYz1yNv.o: en la función `A::A()':
main.cpp:(.text._ZN1AC2Ev[_ZN1AC5Ev]+0x4d): referencia a `A::foo()' sin definir
collect2: error: ld devolvió el estado de salida 1
make: *** [makefile:13: default] Error 1

1. Footnotes

Footnotes:

1

First A() then B()… and so on

2

ccls warning