Возьмем следующий код:Почему стандарт C++ требует, чтобы компиляторы игнорировали вызовы операторов преобразования для базовых типов?
#include <iostream>
struct Base {
char x = 'b';
};
struct Derived : Base {
operator Base() { return Base { 'a' }; }
};
int main() {
Derived derived;
auto base = static_cast<Base>(derived);
std::cout << "BASE -> " << base.x << std::endl;
}
Под и г ++ и лязг ++, это производит:
BASE -> b
Я ожидал следующее:
BASE -> a
Почему? Потому что, почему я прочитал этот код, я вижу оператор преобразования внутри Derived
, который возвращает экземпляр Base
, содержащий 'a'
.
лязг ++ оказал мне любезность испуская предупреждение:
main.cpp:9:5: warning: conversion function converting 'Derived' to its base class 'Base' will never be used
operator Base() { return Base { 'a' }; }
Исследуя это предупреждение, я обнаружил, что это был дизайн (перефразировать для ясности):
тип функции преобразования ([dcl.fct]) - это «функция без параметра, возвращающего идентификатор типа преобразования». Функция преобразования никогда не используется для преобразования объекта (возможно, cv-qualified) [...] в (возможно, cv-квалифицированный) базовый класс этого типа (или ссылку на него) [...].
Таким образом, похоже, что оба компилятора работают правильно. Вопрос в том, почему стандарт требует такого поведения?
Для того чтобы нам не понадобилась другая библиотечная функция 'std :: baseof', чтобы обойти умных людей,« настраивающих »полиморфное поведение? –
Почему вы ожидаете изменения базы? Ничего не меняется. – juanchopanza
Почему вы объявили все переменные 'volatile'? –