我有一个困扰我的问题,我的c ++理解中缺少某些东西.
我正在尝试用boost :: filesystem :: path构建一个对象(它本身是从basic_string构造的)我以为我可以通过在构造同一行的构建boost路径来保存一行代码我的目标.
请参阅以下示例:
我不明白的一件事是,虽然它不起作用,但我也没有错.即似乎没有任何事情发生.那为什么会这样?
class Test {
public:
Test(boost::filesystem::path in) {
std::cout << "Succesful construction" << std::endl;
}
};
int main() {
std::string str("asdf.txt");
boost::filesystem::path p(str);
Test test1(boost::filesystem::path(str)); // Nothing at all happens, but no error
Test test2(p); // "Succesful construction"
}
Run Code Online (Sandbox Code Playgroud)
这是C++所谓的"最令人烦恼的解析".你遇到的问题是:
Test test1(boost::filesystem::path(str));
Run Code Online (Sandbox Code Playgroud)
是一个名为的函数的声明,test1它返回一个Test并且接受一个类型boost::filesystem::path为named的参数str.周围的括号str被解析为多余的,因此该行被解释为等效于:
Test test1(boost::filesystem::path str);
Run Code Online (Sandbox Code Playgroud)
如果您正在使用C++ 11进行编译,则可以使用大括号替换外括号:
Test test1{boost::filesystem::path(str)};
Run Code Online (Sandbox Code Playgroud)
在Pre-C++ 11中,您可以使用一组额外的括号:
Test test1((boost::filesystem::path(str)));
Run Code Online (Sandbox Code Playgroud)