在可变参数模板参数之后,C++是否允许正常参数?

xml*_*lmx 7 c++ standards templates variadic-templates c++11

根据cppreference,以下代码是合法的:

lock_guard( MutexTypes&... m, std::adopt_lock_t t );
Run Code Online (Sandbox Code Playgroud)

但是,以下代码无法使用clang 3.8(-std = c ++ 1z)进行编译:

template<typename... Args>
void f(Args&&..., bool)
{}

int main()
{
    f(1, 2, 3, true); // error! see below for details.
}
Run Code Online (Sandbox Code Playgroud)
1>main.cpp(59,2): error : no matching function for call to 'f'
1>          f(1, 2, 3, true);
1>          ^
1>  main.cpp(54,6) :  note: candidate function not viable: requires 1 argument, but 4 were provided
1>  void f(Args&&..., bool)
1>       ^
1>  1 error generated.
Run Code Online (Sandbox Code Playgroud)

在可变参数之后,C++是否允许正常参数?

Bri*_*ian 9

代码中的函数声明是有效的,但是对于此类函数模板,演绎不起作用.请注意,以下代码格式正确,并实例化特化void f(int, int, int, bool):

template<typename... Args>
void f(Args&&..., bool) {}

int main() {
    f<int, int, int>(1, 2, 3, true);
}
Run Code Online (Sandbox Code Playgroud)

请注意,在C++ 17中,MutexTypes...是类本身的模板参数:

template <class... MutexTypes> class lock_guard;
Run Code Online (Sandbox Code Playgroud)

所以他们是众所周知的,不需要推断.请注意,adopt_lock_t由于adopt_lock_t参数在参数包之后发生,因此构造函数不能用于C++ 17类模板参数推导.如果委员会在C++ 11中具有先见之明,那么他们就会把adopt_lock_t论点放在开头而不是最后,但唉,现在为时已晚.

  • 还不晚,见http://en.cppreference.com/w/cpp/thread/scoped_lock/scoped_lock (2认同)