小编W.F*_*.F.的帖子

为什么不能使用结构化绑定分解lambda表达式的捕获列表

扔烂番茄之前

我知道lambda分解的实际应用目前受到限制,因为无法找到替代失败友好的方法来检查隐藏在分解变量中的lambda捕获数量。这只是一个理论问题,因为我找不到涵盖捕获成员变量访问修饰符的任何标准部分。

int main() {
    int a;
    auto [x] = [a]{};
    static_cast<void>(a);
    static_cast<void>(x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

标准参考

关于lambda捕获的标准部分很长,因此我可能错过了相关的片段。我注意到的是,重点是对应于捕获的非静态成员必须/未命名。

c++ lambda language-lawyer c++17 structured-bindings

4
推荐指数
1
解决办法
552
查看次数

非类型模板参数中的占位符类型是否可以包含作为模板参数传递的函数的重载解析?

这个问题的后续行动.假设占位符可用于推导构成非类型模板参数的函数指针的结果类型.c ++ 17是否允许在传递给模板函数名称时执行重载解析 - 不知道结果类型,执行隐式转换需要什么?

template <auto(*)(int)>
struct Foo { };

int bar(int);
float bar(float);

int main() {
    static_cast<void>(Foo<bar>{});
}
Run Code Online (Sandbox Code Playgroud)

[gcc]以及[clang]似乎接受了代码.

c++ templates language-lawyer c++17

4
推荐指数
1
解决办法
111
查看次数

是否有任何理由说明为什么使用std :: tuple传递c ++模板包

假设我们想要创建一个帮助类来反转模板包,例如如下:

#include <tuple>
#include <utility>
#include <typeinfo>
#include <iostream>

template <class>
struct sizer;

template <template<class...> class Pack, class... Args>
struct sizer<Pack<Args...>> {
   static constexpr size_t value = sizeof...(Args);
};

template <class Pack, class Indices = std::make_index_sequence<sizer<Pack>::value>>
struct reverse_pack;

template <class... Args, size_t... I>
struct reverse_pack<std::tuple<Args...>, std::integer_sequence<std::size_t, I...>> {
    using type = typename std::tuple<typename std::tuple_element<(sizeof...(Args) - I - 1), std::tuple<Args...>>::type...>;
};

int main() {
   std::cout << typeid(reverse_pack<std::tuple<int, float, double>>::type).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我们可以使用例如函数签名作为模板参数成功完成相同的事情:

#include <utility>
#include <typeinfo>
#include <iostream>

template <class> …
Run Code Online (Sandbox Code Playgroud)

c++ templates tuples variadic-templates c++14

2
推荐指数
1
解决办法
215
查看次数

为什么不能将范围解析与成员指针取消引用一起使用?

考虑一个简单的例子:

struct FooParent {
   virtual void bar() { }
};

struct Foo: FooParent {
   void bar() { }
};

int main() {
   Foo foo;
   void (Foo::*foo_member)() = &FooParent::bar;
   //(foo.*FooParent::foo_member)();
   foo.FooParent::bar();
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,foo在调用 bar 成员函数时可以在对象上使用范围解析,但无法显式声明成员函数指针的范围。我同意在使用时应禁止该语法,->*因为运算符有时可能会以意想不到的方式重载,但我无法理解在取消引用时阻止显式范围解析背后的原因.*

我正在尝试禁用指向基类的虚函数的成员指针的虚拟分派。

c++ virtual-functions member-pointers dereference language-lawyer

2
推荐指数
1
解决办法
368
查看次数

即使重载函数的参数计数不匹配,编译器也应该实例化所有参数依赖类型

考虑一个简单的例子:

#include <type_traits>

template <class T, std::size_t N>
struct MaybeAssert {
    using type = T;
    static_assert(N < 1, "Assertion");
};

template <class T>
void foo(typename MaybeAssert<T, 0>::type) {
}

template <class T>
void foo(typename MaybeAssert<T, 0>::type, 
         typename MaybeAssert<T, 1>::type) {
}

int main() {
   foo<int>(2);
}
Run Code Online (Sandbox Code Playgroud)

[gcc]实例化MaybeAssert<T, 1>示例中的哪个触发器static_assert.

另一方面,[clang]仅在函数模板参数的数量匹配时才实例化类型.哪个编译器是对的?

c++ templates language-lawyer

2
推荐指数
1
解决办法
60
查看次数

为什么不使用非类型模板参数实现std :: bind的占位符?

我知道这个问题相当理论化,但我认为如果将占位符定义为模板,例如:

namespace std { 
   namespace placeholders {
      template <size_t> struct placeholder { constexpr placeholder() {}; }; 
      template <size_t N> constexpr placeholder<N> _{};
   }
}
Run Code Online (Sandbox Code Playgroud)

用法:

std::bind(foo, std::placeholders::_<1>, std::placeholders::_<2>); 
Run Code Online (Sandbox Code Playgroud)

或者对于c ++ 11:

namespace std { 
   namespace placeholders {
      template <size_t> struct _ { }; 
   }
}
Run Code Online (Sandbox Code Playgroud)

用法:

std::bind(foo, std::placeholders::_<1>{}, std::placeholders::_<2>{});
Run Code Online (Sandbox Code Playgroud)

代码不会丢失任何清晰度,我们可以使用它做一些奇特的元编程.那么......为什么不std::bind使用非类型模板参数实现占位符?

c++ templates template-meta-programming stdbind c++14

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

擦除一个/多个元素后,矢量数组是否会调整大小?

是否vector.erase调整矢量对象,这样我可以用测量尺寸减小vector.size()

例如;

vector<int> v(5);
v = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

我想删除4 by;

v.erase(v.begin()+4);
Run Code Online (Sandbox Code Playgroud)

我的矢量对象v现在的大小是4 吗?换句话说就是v.size() == 4经过这次手术?

c++ size function vector erase

-2
推荐指数
1
解决办法
3610
查看次数