C++ 默认参数和参数包之间的交互(GCC和clang不一致)

C++ 默认参数和参数包之间的交互(GCC和clang不一致),c++,templates,c++11,variadic-templates,default-arguments,C++,Templates,C++11,Variadic Templates,Default Arguments,我希望编译以下代码: #include <iostream> template <class Tag = void, class T = int, class... Args> void print(T val = T{}, Args... args) { std::cout << val << ' ' << sizeof...(args) << std::endl; } int main() { pri

我希望编译以下代码:

#include <iostream>

template <class Tag = void, class T = int, class... Args>
void print(T val = T{}, Args... args) {
    std::cout << val << ' ' << sizeof...(args) << std::endl;
}

int main() {
    print();
    print(3.14);
    print(0, 1, 2);
}

那么,谁是正确的呢?

从某种意义上说,他们都是正确的

标准中有一个bug,使得代码是否格式正确不清楚


在CWG总结中,似乎有一个共识,即clang拒绝该代码应该是正确的。几个月后,大家一致认为GCC应该正确地接受代码。那么谁知道C++17会发生什么呢。

正如@T.C.在@LightnessRacesinOrbit的评论和回答中指出的,这是一个悬而未决的CWG问题。无论如何,我刚刚找到了一个解决办法:

#include <iostream>

template <class Tag = void, class T, class... Args>
void print(T val, Args... args) {
    std::cout << val << ' ' << sizeof...(args) << std::endl;
}

template <class Tag = void, class T = int>
void print(T val = T{}) {
    std::cout << val << ' ' << 0 << std::endl;
}

int main() {
    print();
    print(3.14);
    print(0, 1, 2);
}
#包括
模板
无效打印(T值、参数…参数){

STD::CUTH.RADAD,我会说,<>代码> ARGS/COD>的默认情况是它根本不存在。关于这个问题,有一个活跃的核心问题,Irc.YEP,.T.C.O.My……惊讶于C++的专业知识,Gonna再次找到解决办法。
#include <iostream>

template <class Tag = void, class T, class... Args>
void print(T val, Args... args) {
    std::cout << val << ' ' << sizeof...(args) << std::endl;
}

template <class Tag = void, class T = int>
void print(T val = T{}) {
    std::cout << val << ' ' << 0 << std::endl;
}

int main() {
    print();
    print(3.14);
    print(0, 1, 2);
}