Posso chamar uma função virtual para inicializar um subobjeto de classe base?

Eu sei que funções virtuais não devem ser chamadas direta ou indiretamente em um construtor, mas esse código funciona bem.
O que tenho aqui é seguro?

#include <iostream>
#include <string>

struct A {
    A (const std::string& name) {std::cout << name << std::endl;}
    virtual std::string tag() const = 0;
};

struct B: A {
    B() : A (tag()) {}
    virtual std::string tag() const override {return "B";}
};

int main() {
    B b; // Output gives "B\n"
}

Caso contrário, o seguinte (com base em um comentário) seria uma solução correta?

// Replacement for class B:

struct B: A {
    B() : A (name()) {}
    virtual std::string tag() const override {return name();}
private:
    static std::string name() {return "B";}  // use static function
};

questionAnswers(1)

yourAnswerToTheQuestion