Могу ли я преобразовать этот вызов C++ с указателем в вызов со ссылкойC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Могу ли я преобразовать этот вызов C++ с указателем в вызов со ссылкой

Сообщение Anonymous »

У меня есть ситуация, когда было бы удобно вызвать существующую функцию, которая принимает ссылочный аргумент, с помощью вызова через std::function, который использует в качестве аргумента указатель, а не ссылку.
В приведенном ниже коде на нескольких компиляторах, для разных процессоров, с некоторыми дефолтными (неоптимизированными настройками компилятора) сгенерированная сборка для функций testRef и testPtr идентична, а сгенерированная сборка для первых двух вызовов в testConversion также идентичны. Это неудивительно, учитывая тесную связь между указателем и ссылкой.
Более того, в выводе, напечатанном ниже, вы можете видеть, что с помощью старомодных указателей на функции C я могу вызовите ссылочную функцию с аргументом-указателем, и результат будет «правильным»; это третья строка вывода. Это неудивительно.
Но в последней строке вывода вы можете видеть, что вызов из C++ приводит к объекту std::function с аргументом-указателем, вызов обращается к testRef (справочная функция), но результаты не «правильные»; различные другие приведения вызывают ошибки сегментации или другое плохое поведение.
Почему это не работает, и есть ли способ заставить это приведение работать, например, возясь с функцией std::function ?
Я понимаю, что есть и другие подходы к общей проблеме; Я могу легко достичь более широкой цели с помощью других средств (объектов интерфейса, операторов преобразования и т. д. и т. п.), и в конце концов я могу использовать одно из этих других средств, но этот подход остается для меня интересным, и мне интересно в том, можно ли заставить его работать, и если нет, то почему.
Я также понимаю, что «нарушаю» различие между ссылками и указателями. Комментируйте сколько хотите, если считаете, что это интересно другим читателям, но я об этом не спрашиваю и не интересуюсь этим.
Спасибо.
#include
#include
#include

class MyClass
{
public:
MyClass () {
mA = 1;
mB = 2;
mC = 3;
}
int mA;
int mB;
int mC;
};

void testRef (MyClass &asRef)
{
std::cout

Подробнее здесь: https://stackoverflow.com/questions/793 ... -reference
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»