C:\Temp>type meow.cpp
#include <type_traits>
 
template <typename T> struct A {
    A() {
        static_assert(std::is_base_of<A<T>, T>::value, "assert1");
        typedef typename std::remove_reference<decltype(*this)>::type meow_t;
        static_assert(std::is_base_of<meow_t, T>::value, "assert2");
    }
};
 
struct C : public A<C> { };
 
void foo() {
    C c;
}
 
C:\Temp>cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 17.00.40316 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.
 
usage: cl [ option... ] filename... [ /link linkoption... ]
 
C:\Temp>cl /EHsc /nologo /W4 /c meow.cpp
meow.cpp
 
C:\Temp>
 
*this is an lvalue so decltype(*this) is indeed A<T>&.