Есть 2 ответа:
- Ответ прост: Это работает, см. /* Магия начинается здесь */ примечание в коде. Пощечина, да, мне неловко, что я этого не увидел.
- Что касается reinterpret_cast и неопределенного поведения, хотя я не задавал этот другой вопрос на all - Да, это что-то вроде reinterpret_cast, но не будьте наивными: такого рода ситуация (осторожно, разработчик) именно поэтому и существует reinterpret_cast. UB, с другой стороны, стал рефлекторным синонимом слова «Я не понимаю или не могу ответить на вопрос». Помимо простых вопросов об объеме объекта, я не вижу никаких причин опасаться UB в этом случае, за исключением очень маловероятного случая, когда комитеты по языку и создатели компиляторов сойдут с ума и тайно изменят основное семантическое сходство между указателями и ссылками. А до тех пор, если я выберу этот подход (для этого мне потребуется некоторое обширное тестирование), модульное тестирование — это дело. Когда это не поможет, какое-то другое, лишь немного более сложное решение будет иметь смысл. Нет уверенности, что я выберу этот подход.
Меня разочаровывает то, что никто не прочитал вопрос и не дал простого ответа (в сопровождении всех предостережений было бы хорошо).
Спасибо за отзыв . Как всегда, разговоры об этом помогли мне найти ответ.
Ура.]
Исходное сообщение:
У меня есть ситуация, когда было бы удобно вызвать существующую функцию, принимающую ссылочный аргумент, с вызовом через std::function, который использует в качестве аргумента указатель, а не ссылку.
В приведенном ниже коде на нескольких компиляторах для разных процессоров с некоторыми значениями по умолчанию (неоптимизированные настройки компилятора) сгенерированная сборка для функций testRef и testPtr идентична, и сгенерированная сборка для первых двух вызовов в testConversion также идентична. Это неудивительно, учитывая тесную связь между указателем и ссылкой.
Более того, в выводе, напечатанном ниже, вы можете видеть, что с помощью старомодных указателей на функции C я могу вызовите ссылочную функцию с аргументом-указателем, и результат будет «правильным»; это третья строка вывода. Это неудивительно.
Но в последней строке вывода вы можете видеть, что вызов из C++ приводит к объекту std::function с аргументом-указателем, вызов обращается к testRef (справочная функция), но результаты не «правильные»; различные другие приведения вызывают ошибки сегментации или другое плохое поведение.
Почему это не работает, и есть ли способ заставить это приведение работать, например, возясь с функцией std::function ?
Я понимаю, что есть и другие подходы к общей проблеме; Я могу легко достичь более широкой цели с помощью других средств (объектов интерфейса, операторов преобразования и т. д. и т. п.), и в конце концов я могу использовать одно из этих других средств, но этот подход остается для меня интересным, и мне интересно в том, можно ли заставить его работать, и если нет, то почему.
Я также понимаю, что «нарушаю» различие между ссылками и указателями. Комментируйте сколько хотите, если считаете, что это интересно другим читателям, но я об этом не спрашиваю и не интересуюсь этим.
Спасибо.
[В ответ на некоторые из комментариев: Да, я понимаю, что то, что я делаю, не правильно C++. Если проблема не интересует никого, кроме меня, не беспокойтесь, я разберусь и опубликую ответ.]
#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
Мобильная версия