Intel® C++ Compiler
Community support and assistance for creating C++ code that runs on platforms based on Intel® processors.
7877 Discussions

Variadic constructor with enable_if not found? (C++11)

Daniel_V_2
Beginner
613 Views

I'm having a bit of trouble with the following C++11 code fragment and icpc 15.0.0. This example is compiled correctly by g++ 4.9. I essentially have a templated vector class (with its scalar type T and size N being template arguments).

The variadically templated constructor that checks whether all the arguments are assignable to T& is not found. When I remove the assignable check (which I cannot do because otherwise an ambiguity occurs with the copy-constructor when N=1) the example compiles.

The manually expanded version for 2 arguments compiles. Any idea for a work-around.

// > icpc -v
// icpc version 15.0.0 (gcc version 4.9.0 compatibility)

// > icpc -std=c++11 i_dont_know_what_is_wrong_with_intel.cpp
// i_dont_know_what_is_wrong_with_intel.cpp(39): error: no instance of constructor "Dummy<T, N>::Dummy [with T=double, N=2U]" matches the argument list
//             argument types are: (double, double)
//     Dummy<double, 2> t{1.0, 2.0};
//                       ^
// compilation aborted for i_dont_know_what_is_wrong_with_intel.cpp (code 2)

#include <type_traits>

template<typename ...T>
struct All : std::true_type { };

template<typename Head, typename ...Tail>
struct All<Head, Tail ...> : std::conditional<Head::value, All<Tail ...>, std::false_type>::type { };

template<typename T, unsigned N>
struct Dummy
{
  // this should work (and does in g++ 4.9), but doesn't
  template<typename ...Args, class = typename std::enable_if</*sizeof...(Args) == N && */
    All<
      std::is_assignable<T&, Args> ...
    >::value
  >::type>
  explicit Dummy(const Args &...args)
  {
  }
};

// this works
template<typename T>
struct DummyFixed2
{
  template<typename Arg1, typename Arg2, class = typename std::enable_if<
    All<
      std::is_assignable<T&, Arg1>,
      std::is_assignable<T&, Arg2>,
    >::value
  >::type>
  explicit DummyFixed2(const Arg1 &arg1, const Arg2 &arg2)
  {
  }
};

int main(int argc, char const *argv[])
{
  DummyFixed2<double> f{1.0, 2.0};
  Dummy<double, 2> t{1.0, 2.0};
  /* code */
  return 0;
}

 

0 Kudos
5 Replies
Daniel_V_2
Beginner
613 Views

Version 15.0.2 exhibits the same problem. I'm really stumped for a work-around... :(

0 Kudos
Kittur_G_Intel
Employee
613 Views

Hi Daniel,
I've filed this issue with the developers and will get back to you as soon as I've an update. Appreciate your patience till then. 
_Kittur

0 Kudos
Cardin_P_
Beginner
613 Views

verifique um provável upgrade para a Version 15.0.2 ou superior, com certeza vai resolver seu problema sem precisar codificar as regras que já existe. 

0 Kudos
Kittur_G_Intel
Employee
613 Views

HI Cardin! 
I've to find someone who can decipher your response! Thanks for the response and hopefully I should find out more on that.
BTW, this issue fails with ICC (with GNU >=4.7 which accepts) and is a bug that I've filed with the developers as mentioned earlier.

_Kittur

0 Kudos
nils_d_
Beginner
613 Views

Hi,

This problem still exists with Intel 17.1 but works with GCC 6.2 and Clang 3.9.0. Is this going to be resolved soon?

 

Best,

Nils

0 Kudos
Reply