Effective Modern C++の91ページの例を確認するのに手間がかかっていましたが、奇妙な問題のように思えました。このコードC++のnoexcept宣言がテンプレートの控除を変更します
template<typename C>
void doStuff(C& a, C& b) noexcept(noexcept(doStuff(a.front(), b.front()))) {
std::cout << "container version" << std::endl;
}
template<>
void doStuff<int>(int& x, int& y) noexcept {
std::cout << "int version" << std::endl;
}
int main() {
vector<int> v1 = {1, 2, 3};
vector<int> v2 = {4, 5, 6};
int x = 5;
int y = 6;
doStuff(x, y);
doStuff(v1, v2);
}
は私に
error: request for member ‘front’ in ‘a’, which is of non-class type ‘int’ void doStuff(C& a, C& b) noexcept(noexcept(doStuff(a.front(), b.front()))) {
だから、それは、doStuffのトップバージョンが呼び出されているように思えるにもかかわらず、a.front()とb.frontのようなエラーになります()する必要がありますintへの参照を返します。コードからすべてのnoexcept宣言を削除すると、期待される出力が得られます。
これはgcc 5.4です。
私は間違っていますか?
おかげ
であなたの専門分野を置き換えテンプレートはcompile.time機能であることに注意してください。 'doStuff'関数の最初のバージョンが定義されているとき、コンパイラは' int'の特殊化について何も知らない。 –
'doStuff'が' noexcept'仕様で最初に使われたときに宣言されていないという問題もあります。 – aschepler