+2        
        
                        - 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 
                        struct A { 
  virtual int transmogrify();
};
 
struct B : A {
  int transmogrify() override { new(this) A; return 2; }
};
 
int A::transmogrify() { new(this) B; return 1; }
 
static_assert(sizeof(B) == sizeof(A));
int main() {
  A i;
  int n = i.transmogrify();
  // int m = i.transmogrify(); // undefined behavior
  int m = std::launder(&i)->transmogrify(); // OK
  assert(m + n == 3);
}
                                 
        
            Yo dawg, we heard you like kostyli, so we put our kostyli into your kostyli, so that you can use kostyli to support our kostyli!
https://en.cppreference.com/w/cpp/utility/launder
А если серьезно, мне еще не удалось соорудить пример, чтоб код с std::launder и без него работали по разному.
        
        
            Запостил: 
 Elvenfighter,
            24 Сентября 2018
        
        
            
            
        
        
    
 
http://govnokod.ru/11417
Чисти указатель, животное
Внутри std::launder находится компиляторо-специфический костыль, который можно назвать "optimization barrier", который сигнализирует компилятору "смотри, жывотное, что под указателем, а не в свои сраные кеши". Где-то читал, что в GCC std::launder был реализован просто:
Но потом хлопцы из LLVM/Clang подсуетились и показали who is who, продемонстрировав пример, когда гнутая реализация делала ересь.
Во втором случае комитет вероятно пошел еще дальше, и сказал "А что если компилятор закеширует целую структуру под указателем? Ведь мы итак знаем, что итак X::n у нас const и читать его после замены без std::launder -- UB." И дальше все так же как и в предыдущем пункте.
http://sandbox.onlinephpfunctions.com/code/b7e8dd12f4d3914031e4784fd6768b1f452f3c41