Ссылки и временные объекты

126
18 апреля 2021, 23:00

Есть такой код:

#include <iostream>
void test(const int& val)
{
    const_cast<int&>(val) = 42;   
}
int main()
{
    int   val1 = 0, val2 = 0, val3 = 0;
    test(val1);
    test(val2 + 0);
    test(static_cast<int>(val3)); //Интересная строка;
    std::cout << val1 << " " << val2 << " " << val3 << std::endl;
    return 0;
}

Вывод GCC:

42 0 0

Вывод MS Visual Studio:

42 0 42

Кто прав и почему?

Answer 1
  1. static_cast<int>(val3), согласно [expr.static.cast]p1, является rvalue-выражением.

  2. Согласно [dcl.init.ref]p5.3, инициализация константной ссылки rvalue-выражением проводит материализацию prvalue, создавая константный временный объект и привязывая ссылку к нему.

  3. [dcl.type.cv]p4 явно запрещает нам модифицировать константные объекты.

Исходя из всех этих пунктов, правильный ответ будет 42 0 0, но т.к. во втором и третьем случае мы имеем неопределённое поведение, то и вывод может быть любым. В результате, разговор о правильном ответе, в целом, не имеет смысла.

Тем не менее студия выводит 42 0 42 не из-за UB, а потому что без флага /permissive- срабатывает её расширение, которое игнорирует static_cast, когда тип не меняется. В результате в третьем случае передается lvalue, а не rvalue. Но это поведение противоречит стандарту и является расширением MSVC, которое, я полагаю, существует для некоторой обратной совместимости.

READ ALSO
ввод только чисел и работа с ними

ввод только чисел и работа с ними

Из интернета "достал" три функции из интернета по теме : "ввод только чисел"

87
.onsubmit редиректит на php файл даже если return false

.onsubmit редиректит на php файл даже если return false

подскажите пожалуйста, в чем может быть проблема: если делаюonsubmit не в теге формы, то выполняется аякс, но все равно идет редирект на php файл,...

101
slick с постоянным слайдом

slick с постоянным слайдом

Есть вот такой слайдер:

124