次のようなパラメーターを保持する汎用構成クラスを作成しようとしています (大幅に簡略化されています)。
class Parameter
{
public:
Parameter(boost::any value, bool isRequired)
: value(value), isRequired(isRequired) {}
bool isSet;
bool isRequired;
boost::any value;
};
class ParameterGroup
{
public:
map<std::string, Parameter> table;
// references for chaining
ParameterGroup& add_parameter_group(const string &token, const bool isRequired);
ParameterGroup& add_parameter(const string &token, const bool isRequired);
template<typename T>
T& get_parameter(const string &token);
};
問題はadd_parameter_group
関数にあります:
ParameterGroup& ParameterGroup::add_parameter_group(const string &token,
const bool &isRequired)
{
table[token] = Parameter(ParameterGroup(), isRequired);
return boost::any_cast<ParameterGroup>(table[token].value);
}
リターンはメッセージでコンパイルに失敗します
error: invalid initialization of non-const reference of type ParameterGroup& from an
rvalue of type ParameterGroup
理由がわかりません。ドキュメントによるとboost::any_cast
:
ポインターが渡された場合、成功した場合は値の内容への同様に修飾されたポインターを返します。それ以外の場合は null が返されます。T が ValueType の場合、保持されている値のコピーを返します。それ以外の場合、T が (おそらく const 修飾された) ValueType への参照である場合、保持されている値への参照を返します。
本来あるべきように参照を返さないのはなぜですか?