[assign] Boost.Assign is incompatible with std::initializer_list
Hi Boost devs, Our testing has discovered an apparent incompatibility between Boost.Assign and std::initializer_list. I'm using Boost 1.55.0 and a build somewhat newer than VC 2013 RTM (I could check with RTM if someone really wanted me to): C:\Temp>type meow.cpp #include <set> #include <boost/assign/list_of.hpp> int main() { std::set<int> s; s = boost::assign::list_of(11)(22)(33); } C:\Temp>cl /EHsc /nologo /W4 /MTd meow.cpp /I boost_1_55_0 meow.cpp meow.cpp(7) : error C2593: 'operator =' is ambiguous E:\binaries\x86ret\inc\set(180): could be 'std::set<int,std::less<_Kty>,std::allocator<_Kty>> &std::set<_Kty,std::less<_Kty>,std::allocator<_Kty>>::operator =(std::initializer_list<int>)' with [ _Kty=int ] E:\binaries\x86ret\inc\set(139): or 'std::set<int,std::less<_Kty>,std::allocator<_Kty>> &std::set<_Kty,std::less<_Kty>,std::allocator<_Kty>>::operator =(std::set<_Kty,std::less<_Kty>,std::allocator<_Kty>> &&)' with [ _Kty=int ] E:\binaries\x86ret\inc\set(123): or 'std::set<int,std::less<_Kty>,std::allocator<_Kty>> &std::set<_Kty,std::less<_Kty>,std::allocator<_Kty>>::operator =(const std::set<_Kty,std::less<_Kty>,std::allocator<_Kty>> &)' with [ _Kty=int ] while trying to match the argument list '(std::set<int,std::less<_Kty>,std::allocator<_Kty>>, boost::assign_detail::generic_list<int>)' with [ _Kty=int ] Note that this repros with std::set and not with std::vector because of a bizarre compiler bug (it's sensitive to the order in which operator=() overloads are declared, and std::set's order is different from std::vector's). Although we've got that compiler bug (and another one affecting overload resolution for braced-init-lists which shouldn't be relevant here), I believe this compiler error is correct, and Boost.Assign is buggy. http://www.boost.org/doc/libs/1_55_0/libs/assign/doc/index.html#list_of_ref depicts an unconstrained "operator Container()", which worked until the containers gained op=() for initializer_list. Is this a known issue? (It should repro for other platforms, although I haven't checked.) Should this conversion operator be constrained so it can't be instantiated for initializer_list? Thanks, STL
Is this a known issue? (It should repro for other platforms, although I haven't checked.)
I dont know how much of this is a largely known issue, but this a problem on C++11 compilers(such as gcc or clang) that I have seen when I was using Boost.Assign on both C++11 compilers and MSVC. I always had to use workarounds to get it work on C++11(which Boost.Assign was already a workaround for MSVC).
Should this conversion operator be constrained so it can't be instantiated for initializer_list?
Yes, ideally, the conversion operator should use default template parameters to exclude initializer lists on compilers that support this. I dont know if VS 2013 supports default template parameters for functions, or not. Thanks, Paul -- View this message in context: http://boost.2283326.n4.nabble.com/assign-Boost-Assign-is-incompatible-with-... Sent from the Boost - Dev mailing list archive at Nabble.com.
[pfultz2]
I dont know how much of this is a largely known issue, but this a problem on C++11 compilers(such as gcc or clang) that I have seen when I was using Boost.Assign on both C++11 compilers and MSVC. I always had to use workarounds to get it work on C++11(which Boost.Assign was already a workaround for MSVC).
Good to know.
Yes, ideally, the conversion operator should use default template parameters to exclude initializer lists on compilers that support this. I dont know if VS 2013 supports default template parameters for functions, or not.
VS 2013 RTM supports default template arguments for function templates. See http://blogs.msdn.com/b/vcblog/archive/2013/12/02/c-11-14-core-language-feat... for my pretty table. Thanks, STL
participants (2)
-
pfultz2
-
Stephan T. Lavavej