下面的代码来自Boost.Spirit x3文档.它使用了我以前从未见过的有趣的C++语法,如果不知道正确的术语,几乎不可能在搜索查询中描述.这是一个类的前向声明的简写吗?C++标准中提到的这个功能在哪里?
namespace parser
{
using x3::eps;
using x3::lit;
using x3::_val;
using x3::_attr;
using ascii::char_;
auto set_zero = [&](auto& ctx){ _val(ctx) = 0; };
auto add1000 = [&](auto& ctx){ _val(ctx) += 1000; };
auto add = [&](auto& ctx){ _val(ctx) += _attr(ctx); };
// What is this? This is the very first use of the identifier `roman`.
x3::rule<class roman, unsigned> const roman = "roman";
// ^^^^^^^^^^^
auto const roman_def =
eps [set_zero]
>>
(
-(+lit('M') [add1000])
>> -hundreds [add] …Run Code Online (Sandbox Code Playgroud) 对于下面的程序,Clang 5(主干)报告IsNoexcept不可扣除,而GCC 7.1段错误.标准(草案)对此有何评论?这是编译器QOI问题吗?
static_assert(__cpp_noexcept_function_type, "requires c++1z");
template<typename T>
struct is_noexcept;
template<bool IsNoexcept>
struct is_noexcept<void() noexcept(IsNoexcept)> {
static constexpr auto value = IsNoexcept;
};
static_assert(is_noexcept<void() noexcept>::value);
static_assert(!is_noexcept<void()>::value);
int main() {}
Run Code Online (Sandbox Code Playgroud)
与提案P0012有关.
在尝试一些模板约束结构时,我在Clang 3.7中遇到了一个令人惊讶的行为:
struct constraint_success {};
struct constraint_failure {};
template<bool>
struct require_t {};
template<>
struct require_t<true> {
static constexpr constraint_success* result = nullptr;
};
template<>
struct require_t<false> {
static constexpr constraint_failure* result = nullptr;
};
template<bool Condition>
constexpr auto require = require_t<Condition>::result;
//A named dummy value, since we need a default
constexpr constraint_success* required = nullptr;
Run Code Online (Sandbox Code Playgroud)
这个decltype在我的编译器中触发SFINAE上下文:
template<constraint_success* value>
using constraint = decltype(value);
Run Code Online (Sandbox Code Playgroud)
相反:
//template<constraint_success* value>
//using constraint = constraint_success*;
Run Code Online (Sandbox Code Playgroud)
例:
//define custom constraints
template<typename T>
constexpr auto Pointer = require<std::is_pointer<T>::value>; …Run Code Online (Sandbox Code Playgroud) 由于libstdc ++缺陷导致编译失败,或者此行为是否与Transactional Memory TS(n4514)兼容?
#include <type_traits>
static_assert(std::is_function_v<void() transaction_safe>, "");
int main() {}
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
struct foo {
int bar(int, int = 0) {
return 0;
}
};
constexpr auto ptr = &foo::bar;
int main() {
return (foo{}.*ptr)(0);
}
Run Code Online (Sandbox Code Playgroud)
正如所料,此代码无法使用最新版本的GCC,Clang和MSVC进行编译.
但是,假设的编译器能够通过constexpr成员函数指针传递默认参数是合理的.如果这个编译器成功编译了<edit>上面的代码而没有警告</ edit>,有效地传递0, 0给foo::bar它,它是否仍然符合ISO C++标准?
可接受的答案将参考标准(或其工作草案).我还没有在N4567的工作草案中找到答案.
编辑:如果标准没有对此问题发表评论,我也会接受这个问题.
c++ ×5
c++11 ×2
type-traits ×2
boost-spirit ×1
c++14 ×1
c++17 ×1
constexpr ×1
libstdc++ ×1
sfinae ×1
templates ×1