CV-квалифицированный тип не может быть преобразован в cv-неквалифицированный тип

0

Я написал пример:

#include <iostream>

struct A
{
    A(const A&){ std::cout << "A(const A&)" << std::endl; }
    A(){ std::cout << "A()" << std::endl; }
};

struct B
{
    B(){ std::cout << "B()" << std::endl; }
    operator A(){ std::cout << "operator A()" << std::endl; return A(); }
};

B b;

void foo(A) { }

int main(){ std::cout << "main function starting..." << std::endl; foo(b); }

DEMO

Он работает нормально, но если мы заменим B b; с const B b; это не сработает.

#include <iostream>

struct A
{
    A(const A&){ std::cout << "A(const A&)" << std::endl; }
    A(){ std::cout << "A()" << std::endl; }
};

struct B
{
    B(){ std::cout << "B()" << std::endl; }
    operator A(){ std::cout << "operator A()" << std::endl; return A(); }
};

const B b;

void foo(A) { }

int main(){ std::cout << "main function starting..." << std::endl; foo(b); }

DEMO

Хотя стандарт говорит в разделе 13.3.3.1/6 [over.best.ics]:

Любая разница в квалификации высшего уровня включается самой инициализацией и не является конверсией.

Я хочу, чтобы кто-то объяснил мне, почему пример seond не работает.

  • 1
    Во втором примере operator A(){ должен быть operator A() const { ?
Теги:

1 ответ

0

Строка, указанная вами, приведена в разделе 13.3.3.1.1 Стандартные последовательности конверсий. Преобразование из B в A является преобразованием, определяемым пользователем. Правила для пользовательских преобразований приведены в следующем разделе стандарта и под заголовком 13.3.3.1.2 Пользовательские последовательности преобразования

То, что вы цитируете, не относится к пользовательским преобразованиям.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню