onlar hakkında uyarıda bulunuyorlar mesele C++ 14'de, işe yarayacak ki:
void call(void (*f)())
{
f();
}
void func() noexcept {}
int main(int argc, char* argv[])
{
call(&func);
return 0;
}
ama C++ 17 olmak call
beyanı değiştirmek gerekir içinde:
void call(void (*f)() noexcept)
{
f();
}
Şablon olarak call
tanımladığınızdan, bunun için endişelenmeniz gerekmez. Yine de, sorunlara neden olabilir çünkü türetilen tür değişiyor, bu genellikle gerçekleşmiyor.
Örneğin, bu kod C++ 14 değil, C++ 17 derlenir:
void foo() noexcept {}
void bar() {}
template <typename F>
void call(bool b, F f1, F f2)
{
if (b)
f1();
else
f2();
}
void foobar(bool b)
{
call(b, &foo, &bar);
}
foo
arasında C++ 14, tiplerde ve bar
aynıdır, fakat farklı olan C++ 17'de şablon çözünürlüğü başarısız olur. bayrak -std=c++1z
ile gcc 7.2 hata iletisi şudur:
Verdiğiniz örnekte
note: template argument deduction/substitution failed:
note: deduced conflicting types for parameter 'F' ('void (*)() noexcept' and 'void (*)()')
, hiçbir sorun olduğunu ve C++ 14 veya C++ 17 yılında derleme bir sorun olmaz modu. Eğer kod buradaki örnekden daha karmaşıksa (örneğin, yukarıda verdiğim örneklere benzer), bazı derleyici problemleriyle karşılaşabilirsiniz. Yeni bir derleyiciniz var gibi görünüyor; -std=c++1z
ile derlemeye çalışın ve uyarı veya hata olup olmadığını görün.
Eğer 'çağrı' projenize tamamen dahilse, önemli değil. Sadece iki farklı çeviri ünitesinin kullanıldığı durumlarda, C++ 17 ile bir tane derlenmediği ve birinin olmadığı durumlarda önemlidir. O zaman bile, 'çağırma' bir şablon işlevi olduğu için, muhtemelen son çalıştırılabilirlikte fazladan bir tanıma sahip olmaktan çok büyük bir etkiye sahip olmayacaktır. –
@DanielH Yukarıda Barry için konuşmak istediğimden değil, ama -wError ile bir proje derliyorsanız, o zaman "zararsız uyarı", programın doğru olmasına rağmen, derlenmemesine neden olacaktır. Bu önemli. – markt1964
@ markt1964 Sadece yazımda '-Wall' kullanılır. '-Werror ile derlerseniz veya derleyici hatalarından kaçınmaya çalışırsanız (ki bu iyi bir fikirdir), o zaman evet, bir sorunla karşılaşırsınız. Belki de, en iyi, koşullara bağlı olarak -Wo-noexcept-type' ekleyerek ele alınabilir. –