Modelos Variadic e construção de cópia via atribuição

Considere este exemplo mínimo:

template  struct foo {}; template <template  class Bar> struct converter { template  converter(const Bar &); }; int main() { converter c(foo()); // This works. // converter c = foo(); This fails } 

A linha comentada falha com o GCC 4.5 e 4.6, com uma mensagem como:

 main.cpp:10:2: error: wrong number of template arguments (1, should be 2) main.cpp:4:8: error: provided for template struct foo main.cpp: In function int main(): main.cpp:15:37: error: conversion from foo to non-scalar type converter requested 

Se, em vez de usar modelos variadic, o número específico de parâmetros de modelo for usado (ou seja, 2 neste caso), não haverá erros. Estou um pouco confuso, pois esperava que as duas linhas fossem exatamente equivalentes: isso é um comportamento esperado?

Sim, isso deveria funcionar. É um erro do GCC. O GCC não suporta os modelos variadic do C ++ 0x ao máximo (e, para ser justo, a especificação ainda está constantemente mudando em detalhes).

O que você diz “Isto funciona” está realmente declarando uma function; ele não inicializa um object, que era o que você pretendia.

Para o que você pretendia, consulte 14.3.3p3, que descreve como a template class Bar pode corresponder a foo , e 14.8.2.5p9, que descreve como foo pode corresponder a foo .

 template  struct foo {}; struct converter { template