1
boost::optional<std::vector<std::wstring>> filePath;

如果我有上面的 boost 可选向量,是否可以通过引用传递它并作为可选参数?

Test(const boost::filesystem::path& targetPath, boost::optional<std::vector<std::wstring>> filePath = boost::none);

我可以filePath同时作为默认参数和引用传递吗?

4

3 回答 3

4

您可以使用可选参考:

请参阅http://www.boost.org/doc/libs/1_58_0/libs/optional/doc/html/boost_optional/optional_references.html

Live On Coliru

#include <boost/optional.hpp>
#include <boost/filesystem.hpp>
#include <vector>
#include <iostream>

void Test(const boost::filesystem::path& targetPath,
          boost::optional<std::vector<std::wstring>& > filePath = boost::none) {
    if (filePath)
        std::cout << filePath->size() << " elements\n";
    else
        std::cout << "default parameter\n";
}

int main() {
    std::vector<std::wstring> path(3, L"bla");

    Test("blabla", path);
    Test("blabla");
}

印刷

3 elements
default parameter
于 2015-06-18T11:26:55.793 回答
0

您所做的是合法的,但您不能将引用作为默认参数传递。如果你想要这样,你需要传递一个值,或者包裹在另一个 boost::optional 周围的文件路径。

于 2015-06-18T10:32:30.947 回答
0

正如@sehe 所写,将引用放在 boost optional ( boost::optional<std::vector<std::wstring>& >) 中,或者使用const引用:

void Test(const boost::filesystem::path& targetPath,
          const boost::optional<std::vector<std::wstring> >& filePath = boost::none)
{

}

现场示例:http ://coliru.stacked-crooked.com/a/324e31e1854fadb9

在 C++ 中,不允许将临时对象绑定到非常量引用。在这种情况下,默认值是临时值,因此您需要一个 const 引用。

于 2015-06-18T11:39:32.450 回答