Почему boost :: any не содержит строкового литерала?

#include <boost/any.hpp>
#include <list>
#include <string>
#include <vector>

struct _time_t {
int month;
int year;
};int main()
{
std::string str = "hahastr";
_time_t t;
std::vector<boost::any> objVec;
objVec.push_back(1);
char* pstr = "haha";
//boost::any charArr = "haha"; not compile
//objVec.push_back("haha"); not compile
objVec.push_back(pstr);
objVec.push_back(str);
objVec.push_back(t);
return 0;
};

комментированные строки кода не компилируются, почему? Я думаю, что строковый литерал может выступать в качестве char * в большинстве случаев, связано ли это r-значение и l-r-значение?

сообщение об ошибке:
test_boost_any.cc

D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocale(336) : wa
rning C4530: C++ exception handler used, but unwind semantics are not enabled. S
pecify /EHsc
e:\projects\framework\boost_1_53_0\boost/any.hpp(122) : error C2536: 'boost::any
::holder<ValueType>::boost::any::holder<ValueType>::held' : cannot specify expli
cit initializer for arrays
with
[
ValueType=const char [5]
]
e:\projects\framework\boost_1_53_0\boost/any.hpp(139) : see declaration
of 'boost::any::holder<ValueType>::held'
with
[
ValueType=const char [5]
]
e:\projects\framework\boost_1_53_0\boost/any.hpp(120) : while compiling
class template member function 'boost::any::holder<ValueType>::holder(ValueType
(&))'
with
[
ValueType=const char [5]
]
e:\projects\framework\boost_1_53_0\boost/any.hpp(47) : see reference to
function template instantiation 'boost::any::holder<ValueType>::holder(ValueType
(&))' being compiled
with
[
ValueType=const char [5]
]
e:\projects\framework\boost_1_53_0\boost/any.hpp(46) : see reference to
class template instantiation 'boost::any::holder<ValueType>' being compiled
with
[
ValueType=const char [5]
]
test_boost_any.cc(19) : see reference to function template instantiation
'boost::any::any<const char[5]>(ValueType (&))' being compiled
with
[
ValueType=const char [5]
]

4

Решение

строковый литерал не указатель, это array of N const charв вашем случае, так как boost::any конструктор получает T (который выводится char[5]не const char*преобразование массива в указатель не может работать здесь), но вы не можете инициализировать массив другим массивом в initializer-list,

4

Другие решения

Значения Boost.any должны быть действительными для назначения (требование ValueType). Строковый литерал, однако, является массивом, и массивы нельзя назначать в C ++.

Вы можете просто привести литерал к const char * если тебе это нужно

2

Самый простой обходной путь для семантика грубого массива в C здесь есть

boost::any charArr = +"haha";

Обратите внимание на использование + неявно затухать массив символов в const char*

Другие объяснили проблему с семантикой значений массива

2

Компилятор скажет вам, что он не может принять массив, например, VS2010 скажет вам:

1>D:\SRC\CDR\Trunk\DRIT\ThirdParty\boost/any.hpp(122): error C2536: 'boost::any::holder<ValueType>::boost::any::holder<ValueType>::held' : cannot specify explicit initializer for arrays
1>          with
1>          [
1>              ValueType=const char [5]
1>          ]
1>          D:\SRC\CDR\Trunk\DRIT\ThirdParty\boost/any.hpp(139) : see declaration of 'boost::any::holder<ValueType>::held'
1>          with
1>          [
1>              ValueType=const char [5]
1>          ]
1>          D:\SRC\CDR\Trunk\DRIT\ThirdParty\boost/any.hpp(120) : while compiling class template member function 'boost::any::holder<ValueType>::holder(ValueType (&))'
1>          with
1>          [
1>              ValueType=const char [5]
1>          ]
1>          D:\SRC\CDR\Trunk\DRIT\ThirdParty\boost/any.hpp(46) : see reference to class template instantiation 'boost::any::holder<ValueType>' being compiled
1>          with
1>          [
1>              ValueType=const char [5]
1>          ]
1>          toto.cpp(20) : see reference to function template instantiation 'boost::any::any<const char[5]>(ValueType (&))' being compiled
1>          with
1>          [
1>              ValueType=const char [5]
1>          ]

Тип «ха-ха», это не const char* но const char[5],
Если вы бросили строку в char* это скомпилирует:

boost::any charArr = static_cast<const char*>("haha"); // will compile

Кроме того, вы можете просто сохранить std::string например. Я подозреваю, что это потому, что массив не может быть сохранен как указатель. Вы также можете использовать boost::array или же std::array (если есть).

Вот ссылка на обсуждение для добавления поддержки массивов в Boost

1

Упрощенная версия этой проблемы:

template <typename T>
class Array
{
public:
Array(T value) : value_(value) {}
private:
T value_;
};

int main()
{
int a[5] = {1,2,3,4,5};
Array<int[5]> arr = a;
return 0;
}
0