Le code suivantComment puis-je interdire les appels à la fonction membre const d'un objet rvalue dans C++ 2011?
#include <vector>
#include <string>
#include <iostream>
std::string const& at(std::vector<std::string> const& n, int i)
{
return n[i];
}
std::vector<std::string> mkvec()
{
std::vector<std::string> n;
n.push_back("kagami");
n.push_back("misao");
return n;
}
int main()
{
std::string const& s = at(mkvec(), 0);
std::cout << s << std::endl; // D'oh!
return 0;
}
peut conduire à l'accident parce que le vecteur d'origine est déjà détruit là. En C++ 2011 (C++ 0x) après rvalue référence est introduit dans une fonction supprimé déclaration peut être utilisée pour interdire complètement les appels à at
si l'argument vecteur est un rvalue
std::string const& at(std::vector<std::string>&&, int) = delete;
Cela semble bon, mais le code suivant encore causer accident
int main()
{
std::string const& s = mkvec()[0];
std::cout << s << std::endl; // D'oh!
return 0;
}
parce que les appels à la fonction de membre operator [] (size_type) const
d'un objet rvalue est encore autorisée. Est-ce que je peux interdire ce genre d'appels?
CORRECTIF:
Les exemples ci-dessus n'est pas ce que je faisais dans des projets concrets. Je me demande si C++ 2011 toute fonction de soutien de membre admissible comme
class A {
void func() rvalue; // Then a call on an rvalue object goes to this overload
void func() const;
};
CORRECTIF:
Il est grand, mais je pense que la norme C de va trop loin à cette fonction. Quoi qu'il en soit, j'ai le code suivant compilé sur clang ++ 2.9
#include <cstdio>
struct A {
A() {}
void func() &
{
puts("a");
}
void func() &&
{
puts("b");
}
void func() const &
{
puts("c");
}
};
int main()
{
A().func();
A a;
a.func();
A const b;
b.func();
return 0;
}
Merci beaucoup!
Je J'ai toujours trouvé cette référence contraignante. Cela a dû être une bonne idée pour commencer, et bien sûr c'est pratique à certains moments, mais son potentiel de destruction est incroyable et même l'inspection du code méticuleux peut ne pas le détecter ...:/ –
Merci pour cet indice, mais j'ai compilé erreurs sur g ++ 4.6.0. Pouvez-vous me dire quel compilateur peut gérer cela? – neuront
Si vous rendez public les surcharges 'func', les versions récentes de clang géreront cet exemple. –