Нет, в настоящее время это невозможно в C ++. Это называется «идеальная пересылка» и разрешено в C ++ 0x. Вы можете смоделировать его, создав перегрузки вашего конструктора до фиксированного максимума (например, 8 параметров), как для константных, так и для неконстантных ссылок. Это все еще не идеально (временные файлы не будут пересылаться как временные), но обычно работает на практике:
template<typename T1>
B(T1 &a1):A(a1) {
// do some more stuff
}
template<typename T1>
B(T1 const &a1):A(a1) {
// do some more stuff
}
template<typename T1, typename T2>
B(T1 &a1, T2 &a2):A(a1, a2) {
// do some more stuff
}
template<typename T1, typename T2>
B(T1 const &a1, T2 const &a2):A(a1, a2) {
// do some more stuff
}
template<typename T1, typename T2>
B(T1 const &a1, T2 &a2):A(a1, a2) {
// do some more stuff
}
template<typename T1, typename T2>
B(T1 &a1, T2 const &a2):A(a1, a2) {
// do some more stuff
}
// ...
Генерация может быть автоматизирована с помощью Boost.Preprocessor или некоторого скрипта, но это не совсем хорошо, так как количество перегрузок быстро растет.
Короче говоря, не пишите свои конструкторы самостоятельно, пока не будет доступен C ++ 0x, который поддерживает и совершенную пересылку для любой функции, а также специальную пересылку конструктора ("using A::A;"
).