У меня есть этот фрагмент кода, который печатает содержимое каталога с помощью Boost.Filesystem:
class Shell {
private:
const string& command;
const path& firstPath;
const path& secondPath;
public:
// constructor
Shell(const string& _command, const path& _firstPath, const path& _secondPath = path()): command(_command), firstPath(_firstPath), secondPath(_secondPath) {}
//destructor
~Shell() {}
//execute commands
void executeCommand()
{
if(command.compare("ls"))
{
ls();
}
}
void ls()
{
if(exists(firstPath))
{
vector<path> vecPath;
copy(directory_iterator(firstPath), directory_iterator(), back_inserter(vecPath));
sort(vecPath.begin(), vecPath.end());
for(vector<path>::iterator it = vecPath.begin(); it != vecPath.end(); ++it)
{
cout << *it << endl;
}
}
}
};
int main(int argc, char** argv)
{
path Path = "c:\\workspace";
Shell shell("ls", Path); // GOOD
// Shell shell("ls", "c:\\workspace"); BAD creates temporary !!
shell.executeCommand();
}
Если я отправлю свой второй аргумент direclty как const char * Я знаю, что он создаст временныйи мой аргумент конструктора будет виден только в конструкторе, а затем потерян из-за ссылки на временный.
Мой вопрос: почему то же самое не происходит с первым аргументом, строкой, потому что я посылаю ему такжекак const char * напрямую, но значение не теряется вне конструктора?