我有以下简单的XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<cars>
<car>
<data attrib="Make">
<text>Volvo</text>
</data>
<data attrib="Model">
<text>855</text>
</data>
</car>
<car>
<data attrib="Make">
<text>Volvo</text>
</data>
<data attrib="Model">
<text>745</text>
</data>
</car>
<car>
<data attrib="Make">
<text>Volvo</text>
</data>
<data attrib="Model">
<text>V70R</text>
</data>
</car>
</cars>
Run Code Online (Sandbox Code Playgroud)
以下XPath:
/cars/car/data[(@attrib='Model') and (text='855')]
Run Code Online (Sandbox Code Playgroud)
这将返回以下结果:
<data attrib="Model"><text>855</text></data>
Run Code Online (Sandbox Code Playgroud)
我希望XPath返回<car>匹配的整个块.
所以返回数据将是这样的:
<cars>
<car>
<data attrib="Make">
<text>Volvo</text>
</data>
<data attrib="Model">
<text>855</text>
</data>
</car>
</cars>
Run Code Online (Sandbox Code Playgroud)
我如何修改上面的XPath表达式来实现这一目标?
C++ 中的用户重载逻辑运算符 ( &&, ||) 的行为类似于常规函数。也就是说,bool operator&&(const T &a, const T2 &b);在进入函数之前对 in 的两个参数进行求值,因为进入函数是 C++ 中的序列点[1]。到这里一切都很好。
现在, \xe2\x80\x9c 内置运算符 && 和 || 执行短路评估\xe2\x80\x9d [2][3],其中左侧和右侧之间有一个序列点。引用的参考文献并没有明确 \xe2\x80\x9cbuiltin\xe2\x80\x9d 是什么,只是它们接受bool操作数,或者使用 \xe2\x80\x9c 上下文转换为 bool\xe2\x80\ 将它们转换x9d。它还提到,只有 \xe2\x80\x9c 两个标准库类重载这些运算符,[因为]短路属性 (...) 不适用于重载,并且因为具有布尔语义的类型并不常见。\xe2\x80\ x9d [2]
具有布尔语义的类型?\xe2\x80\x9c 内置运算符\xe2\x80\x9d 到底如何工作?是否根本不可能用短路求值来定义逻辑运算符?
\n\n[1] https://en.wikipedia.org/wiki/Sequence_point
\n\n[2] http://en.cppreference.com/w/cpp/language/operator_logic
\n\n\n在这个 SO 答案和这个提案中,我们可以看到 的实现(为了方便起见,在下面包含)std::is_specialization_of,它可以检测类型是否是给定模板的特化。
template< class T, template<class...> class Primary >\nstruct is_specialization_of : std::false_type {};\n\ntemplate< template<class...> class Primary, class... Args >\nstruct is_specialization_of< Primary<Args...>, Primary> : std::true_type {};\nRun Code Online (Sandbox Code Playgroud)\n该提案明确指出此类型特征不受继承影响:
\n\n\n所提出的特征仅考虑专业化。由于特化与继承无关,因此当任何模板参数恰好通过继承定义时,trait\xe2\x80\x99s 结果不受影响。
\n
template< class > struct B { };\ntemplate< class T > struct D : B<T> { };\n\nstatic_assert( is_specialization_of_v< B<int>, B> );\nstatic_assert( is_specialization_of_v< D<int>, D> );\n\nstatic_assert( not is_specialization_of_v< B<int>, D> );\nstatic_assert( not is_specialization_of_v< D<int>, B> );\nRun Code Online (Sandbox Code Playgroud)\n有没有一种方法可以实现确实考虑继承的东西,其行为类似于 …
以下尝试包装 lambda 的(简化)代码向我提供了一些 Clang 版本的警告,但不是全部,也不是 gcc。
template<typename Lambda>
auto wrapLambda(Lambda lambda)
{
return [&lambda]() {
lambda();
};
}
auto wrappedLambda = wrapLambda([](){ return 0; });
Run Code Online (Sandbox Code Playgroud)
warning: address of stack memory associated with parameter 'lambda' returned [-Wreturn-stack-address]
return [&lambda]() {
^~~~~~
Run Code Online (Sandbox Code Playgroud)
这是一个错误,还是我错过了什么?我x86-64 clang (trunk)在Godbolt 中收到警告,并clang version 11.1.0作为更大的回购的一部分,但我无法隔离该版本的故障。
这个相关问题中的例子没有给出警告。
改进(我认为)版本:
template<typename Callable>
auto wrapCallable(Callable&& callable)
{
return [callable = std::forward<Callable>(callable)]() {
callable();
};
}
auto wrappedCallable = wrapCallable([](){ return 0; });
Run Code Online (Sandbox Code Playgroud)
这沉默的警告与x86-64 clang (trunk) …