小编Bar*_*air的帖子

Boost.Spirit使用的这个不寻常的C++模板功能的名称是什么?

下面的代码来自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)

c++ templates boost-spirit language-lawyer c++11

51
推荐指数
2
解决办法
8519
查看次数

类模板部分特化是否允许noexcept演绎?

对于下面的程序,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有关.

c++ type-traits language-lawyer c++17

8
推荐指数
1
解决办法
356
查看次数

模板值参数上的decltype应该触发SFINAE上下文吗?

在尝试一些模板约束结构时,我在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)

c++ sfinae language-lawyer template-meta-programming c++14

7
推荐指数
1
解决办法
448
查看次数

为什么在使用GCC 7,libstdc ++和-fgnu-tm进行编译时,std :: is_function无法识别transaction_safe函数?

由于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)

c++ transactional-memory libstdc++ type-traits

5
推荐指数
1
解决办法
195
查看次数

C++标准是否通过constexpr成员函数指针明确禁止调用中的默认参数?

请考虑以下代码:

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, 0foo::bar它,它是否仍然符合ISO C++标准?

可接受的答案将参考标准(或其工作草案).我还没有在N4567的工作草案中找到答案.

编辑:如果标准没有对此问题发表评论,我也会接受这个问题.

c++ language-lawyer constexpr c++11

3
推荐指数
1
解决办法
219
查看次数