Я написал пример:
#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); }
Он работает нормально, но если мы заменим 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); }
Хотя стандарт говорит в разделе 13.3.3.1/6 [over.best.ics]
:
Любая разница в квалификации высшего уровня включается самой инициализацией и не является конверсией.
Я хочу, чтобы кто-то объяснил мне, почему пример seond не работает.
Строка, указанная вами, приведена в разделе 13.3.3.1.1 Стандартные последовательности конверсий. Преобразование из B
в A
является преобразованием, определяемым пользователем. Правила для пользовательских преобразований приведены в следующем разделе стандарта и под заголовком 13.3.3.1.2 Пользовательские последовательности преобразования
То, что вы цитируете, не относится к пользовательским преобразованиям.
operator A(){
должен бытьoperator A() const {
?