Почему static_cast есть ссылка? [Дубликат]

Самое простое решение - создать функцию JavaScript и вызвать его для обратного вызова Ajax success.

function callServerAsync(){
    $.ajax({
        url: '...',
        success: function(response) {

            successCallback(response);
        }
    });
}

function successCallback(responseObj){
    // Do something like read the response and show data
    alert(JSON.stringify(responseObj)); // Only applicable to JSON response
}

function foo(callback) {

    $.ajax({
        url: '...',
        success: function(response) {
           return callback(null, response);
        }
    });
}

var result = foo(function(err, result){
          if (!err)
           console.log(result);    
}); 
0
задан Ruggero Turra 16 January 2015 в 16:29
поделиться

4 ответа

Поскольку объект Derived* не является объектом Base*, и вполне возможно, что у двух могут быть разные макеты памяти или представления значений (если требования выравнивания Base и Derived отличаются, например). Поскольку один из них не является другим, static_cast бессилен выполнять преобразование.

Если вы знаете, что делаете, и знаете, что тип каламбур в порядке, используйте инструмент для типа punning & mdash; reinterpret_cast:

reinterpret_cast<Base*&>(derived);

И помните о любых последствиях неправильного использования (как всегда идет reinterpret_cast). Обратите внимание, в частности, что на C ++ 11 3.10 / 10 любой доступ через результат приведения будет неопределенным поведением в отношении стандарта (хотя ваш компилятор может дать более надежные гарантии).

Обратите внимание, что в общем случае приведение от Derived* до Base* не обязательно должно быть no-op. Например, он может включать сдвиг адреса, если задействовано несколько наследований.

1
ответ дан Angew 31 August 2018 в 15:50
поделиться

Для вашей ошибки измените это значение

static_cast<Base*&>(derived);
to 
static_cast<Base*>(derived);
                ^^

См. здесь http://ideone.com/1QuMLK

-1
ответ дан Ankur 31 August 2018 в 15:50
поделиться

В соответствии с вашим комментарием:

«Нет, это не академический вопрос. Мне нужно вызвать функцию, принимающую в качестве аргумента Base*&»

Правильный способ решения это создать новую переменную указателя соответствующего типа и передать ее (или, вернее, ссылку на нее) соответствующей функции:

struct Base { };
struct Derived : Base { };

int main()
{
    Derived* derived = nullptr;
    Base* base = static_cast<Base*>(derived);
    my_function(base); // takes a Base*& argument

    // If you need the pointer value and are sure that
    // it's a Derived* type:
    derived = static_cast<Derived*>(base);
}

Обратите внимание, что вы, скорее всего, получили этот ответ скорее, если бы вы включили соответствующую информацию (из комментария, приведенного выше) в самом вопросе.

3
ответ дан davmac 31 August 2018 в 15:50
поделиться

, если вам нужна ссылка, которую вы должны сделать

Base* ptr = static_cast<Base*>(derived);
Base &ref = *ptr;

, вы не можете наложить указатель на ссылку - это совсем другие вещи

-1
ответ дан pm100 31 August 2018 в 15:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: