2016-07-21 3 views
0

Supposons que j'ai une classe comme ceci:La meilleure façon de stocker et construire ensemble de const membres ou des chaînes

class foo { 
    const A arr; 
    foo(B arg): arr(arg) { } 
}; 

Quel est le choix le plus efficace pour les types de A et B. Je pensais quelque chose comme ça,

class foo { 
    const std::initializer_list<std::string> arr; 
    foo(std::initializer_list<std::string> arg): arr(arg) { } 
}; 

Mais je pense que cela va copier-construire des chaînes dans arr. Je voudrais être en mesure de le faire:

std::string str1("there"), str2("now"); 
foo bar({"hello",str1,std::move(str2)}); 

et ont des chaînes rvalue dans les crochets déplacés dans arr. Dois-je utiliser std::initializer_list ou std::vector ou autre chose?

+0

N'utilisez pas 'initializer_list' en tant que membre. 'initializer_list' est ** pas ** un conteneur, il ne gère pas le stockage, il ne fait référence qu'à un tableau alloué de manière externe. C'est pour _initialiser_ les choses, pas pour stocker des choses. L'indice est dans le nom. –

Répondre

1

Définir arr comme std::vector<std::string>, et l'argument du ctor comme std::initializer_list<std::string>, principalement ce que vous avez deviné.

+0

Est-ce que 'str2' dans mon exemple d'utilisation sera déplacé avec cette implémentation? – SU3