forward_as_tuple是非const

时间:2017-11-01 13:38:32

标签: c++ c++14 boost-spirit-x3

我试图将两个不同向量的元组作为属性传递给Spirit X3规则。一个明智的方法似乎是将它们包装在forward_as_tuple中,因为我只想传递引用。这很好,但我必须写一个separat变量声明,然后传递它,因为非const临时生命周期规则会咬我。否则。

最后,我最终写了as_const(std::forward_as_tuple(ourBoxes, scoreVals))之类的东西。通过制作临时const,我可以传递它。临时 const - 因为所有元素类型都是引用,这或多或少是给定的。

这让我想知道,是否有任何设计理由使forward_as_tuple返回类型为非const?换句话说,你怎么能有效地改变只有引用类型的元组?

修改 在下面添加了一个正确的示例。这与我想要使用X3的事实有关,并且X3中的属性类型始终是引用,因此通过值传递属性不是一个选项。更广泛的问题仍然是,forward_as_tuple有非const返回类型是否有任何理由。

#include <boost/fusion/adapted/std_tuple.hpp>
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/spirit/home/x3.hpp>

using namespace boost::spirit;
using namespace std;

// Coming in C++ 17
template <class T>
constexpr std::add_const_t<T>& as_const(const T& t) noexcept
{
    return t;
}

int main()
{
    int x, y;
    string readme = "42 43";
    // Doesn't work
    // phrase_parse(readme.begin(), readme.end(), x3::int_ > x3::int_,
    //       x3::space, forward_as_tuple(x, y));
    // Works:
    phrase_parse(readme.begin(), readme.end(), x3::int_ > x3::int_,
            x3::space, as_const(forward_as_tuple(x, y)));

    // Is there any reason for forward_as_tuple not returning a const?
    // i.e. some use case where forward_as_tuple HAS to return a non-const for
    // proper operation
}

0 个答案:

没有答案