用boost :: filesystem :: path作为参数调用C++构造函数 - 没有任何事情发生

win*_*rgy 1 c++ constructor

我有一个困扰我的问题,我的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)

Bar*_*rry 5

这是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)