Интересно, если есть обходной путь такая ситуация:Инициализация анонимного переменной-члена класса с станд :: функция
class A
{
class
{
public:
void setValue(int val) {i=val;}
private:
int i;
} B = initB(10);
std::function<decltype(B)(int)> initB = [this](int value)
{decltype(B) temp;
temp.setValue(value);
return temp;};
}
//...
A a; //crash
//...
Я предполагаю, что это связано с порядком инициализации. Переменная B
инициализируется вызовом неинициализированного экземпляра std::function
, следовательно, сбой. По моей логике, обходным путем было бы сначала инициализировать std::function
, затем инициализировать элемент B
. Но тогда, такой код не действует:
class A
{
//error: 'B' was not declared in this scope
std::function<decltype(B)(int)> initB = [this](int value)
{decltype(B) temp;
temp.setValue(value);
return temp;};
class
{
public:
void setValue(int val) {i=val;}
private:
int i;
} B = initB(10);
}
я пытался сделать, чтобы сделать std::function
static
, и такой код работает, но требует non-constexpr/const
члена, потому что станд :: функция имеет non-trivial destructor
- что это плохо, потому что требуется исходный файл, который требует создания такого файла, что требует некоторого эффекта и уничтожения моей красивой иерархии классов только для заголовка! (Я имею в виду, я мог бы лениться и определить эту переменную в заголовке, но тогда возникает проблема с множественным определением). Я знаю, что это может быть плохой дизайн (я просто проверяю вещи), но есть ли у вас какие-либо идеи о том, как решить проблему без привлечения исходных файлов?
Вам разрешено пересылать вложенные классы. Таким образом, вы можете присвоить классу имя и ссылаться на него вместо использования 'decltype' в элементе данных. Или полностью разделите определение вложенного класса и элемента данных. Я не уверен, что это слияние покупает вас. –
@Johannes Schaub Теперь, когда я смотрю на него, я не знаю, почему я хотел, чтобы это было анонимно. Спасибо за ответ :) – xinaiz