はcppreferenceによれば、次のコードが正当である:C++はバリデーションテンプレートパラメータの後に通常のパラメータを許可しますか?
lock_guard(MutexTypes&... m, std::adopt_lock_t t);
しかし、次のコードは、(-std = C++ 1Z)打ち鳴らす3.8でコンパイルすることができない。
template<typename... Args>
void f(Args&&..., bool)
{}
int main()
{
f(1, 2, 3, true); // error! see below for details.
}
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.
C++は可変パラメータの後に通常のパラメータを使用できますか?
マイコンパイラは3.8です。 gcc 6.2も失敗します。 – xmllmx
'lock_guard'の例ではクラスコンストラクタなので、すべてのテンプレート引数は関数呼び出しの引数から推測するのではなく、事前に分かっていることに注意してください。 – BoBTFish
C++ 17ではなく、C++ 11です。 – ForEveR