У меня есть несколько связанных классов, как в следующем примере, где я хочу, чтобы они поддерживали экземпляры не-const и const (как в функции x
):
#include <vector>
class Original;
class View
{
public:
View(Original *that) : m(that) {}
Original * m;
};
class Original
{
public:
auto columns() {return View(this);}
//~ const auto columns() const {return View(this);} // comment #1
std::vector<int> m;
};
void x()
{
Original o1;
const Original o2;
//~ o2.columns(); // comment #2
}
Я компилирую это с g++ -std=gnu++17 -c const.cpp
и получим следующие результаты:
case 1: точно так же, как и выше: компилируется просто отлично (что уже озадачивает меня в свете того, что в случае 2 ниже я просто добавляю вызов, и он не удастся ...)
case 2: раскомментируйте # 2, и мы получим ...
const.cpp: In function 'void x()':
const.cpp:24:13: error: passing 'const Original' as 'this' argument discards qualifiers [-fpermissive]
o2.columns(); // comment #2
^
const.cpp:15:7: note: in call to 'auto Original::columns()'
auto columns() {return View(this);}
^~~~~~~
case 3: кроме того, раскомментируем # 1; который дает ...
const.cpp: In member function 'const auto Original::columns() const':
const.cpp:16:46: error: invalid conversion from 'const Original*' to 'Original*' [-fpermissive]
const auto columns() const {return View(this);} // comment #1
^
const.cpp:8:2: note: initializing argument 1 of 'View::View(Original*)'
View(Original *that) : m(that) {}
^~~~
Мне кажется, мне нужен конструктор для создания объекта const, который недоступен в C ++. Поэтому я попытался сделать View
шаблонным классом для поддержки как константного, так и неконстантного члена m
. Но я не сразу запустил его, и в любом случае он кажется довольно уродливым.
Кто-нибудь намекает? Большое спасибо уже!