草庐IT

args_type

全部标签

c++ - 删除 operator=(Type type) 就够了吗?

对于不可移动类型,以下内容是否足够(从最佳实践的角度来看)?classA{A(constA&)=delete;A(A&&)=delete;A&operator=(A)=delete;public:A();};或者我必须单独删除复制/移动赋值运算符吗?这里还需要析构函数吗? 最佳答案 是的,将复制构造函数和复制赋值运算符声明为deleted就足够了。由于您要声明复制构造函数和复制赋值运算符,因此不会自动生成移动构造函数和移动赋值运算符。您不需要显式声明它们deleted。来自§12.8/9(已添加重点)Ifthedefinitiono

c++ - 删除 operator=(Type type) 就够了吗?

对于不可移动类型,以下内容是否足够(从最佳实践的角度来看)?classA{A(constA&)=delete;A(A&&)=delete;A&operator=(A)=delete;public:A();};或者我必须单独删除复制/移动赋值运算符吗?这里还需要析构函数吗? 最佳答案 是的,将复制构造函数和复制赋值运算符声明为deleted就足够了。由于您要声明复制构造函数和复制赋值运算符,因此不会自动生成移动构造函数和移动赋值运算符。您不需要显式声明它们deleted。来自§12.8/9(已添加重点)Ifthedefinitiono

c++ - 到 std::function<R(ARGS...)> 的可变参数模板转换适用于 GCC 而不是 MSVC2013,为什么?

如果这是重复的,我很抱歉。但我在搜索中找不到任何内容。我可以使用c++11/c++14的任何最新功能。如有必要,我可以升级到VS2015。我正在尝试编写一个类,该类在分配时将自动转换为具有特定签名的std::function。我有适用于GCC的代码,但在MSVC2013上失败了。该代码是重新创建错误的片段。WTFMSVC?!我也知道这是有风险的代码,自动转换函数指针等,但它是用于插件库的私有(private)实现,我只想定义一次函数签名。如果有另一种方法可以编写代码,在main()中完成相同的功能并同时在两者上工作,我会全力以赴。GCCc++11工作正常-Demo#include#in

c++ - 到 std::function<R(ARGS...)> 的可变参数模板转换适用于 GCC 而不是 MSVC2013,为什么?

如果这是重复的,我很抱歉。但我在搜索中找不到任何内容。我可以使用c++11/c++14的任何最新功能。如有必要,我可以升级到VS2015。我正在尝试编写一个类,该类在分配时将自动转换为具有特定签名的std::function。我有适用于GCC的代码,但在MSVC2013上失败了。该代码是重新创建错误的片段。WTFMSVC?!我也知道这是有风险的代码,自动转换函数指针等,但它是用于插件库的私有(private)实现,我只想定义一次函数签名。如果有另一种方法可以编写代码,在main()中完成相同的功能并同时在两者上工作,我会全力以赴。GCCc++11工作正常-Demo#include#in

c++ - 为什么我需要在 map::emplace 中为不可复制对象的单个 arg 构造函数使用分段构造?

以下代码无法在gcc4.8.2上编译。问题是此代码将尝试复制构造std::pair由于structA,这不可能发生缺少复制和移动构造函数。gcc在这里失败还是我遗漏了什么?#includestructA{intbla;A(intblub):bla(blub){}A(A&&)=delete;A(constA&)=delete;A&operator=(A&&)=delete;A&operator=(constA&)=delete;};intmain(){std::mapmap;map.emplace(1,2);//doesn'tworkmap.emplace(std::piecewise_

c++ - 为什么我需要在 map::emplace 中为不可复制对象的单个 arg 构造函数使用分段构造?

以下代码无法在gcc4.8.2上编译。问题是此代码将尝试复制构造std::pair由于structA,这不可能发生缺少复制和移动构造函数。gcc在这里失败还是我遗漏了什么?#includestructA{intbla;A(intblub):bla(blub){}A(A&&)=delete;A(constA&)=delete;A&operator=(A&&)=delete;A&operator=(constA&)=delete;};intmain(){std::mapmap;map.emplace(1,2);//doesn'tworkmap.emplace(std::piecewise_

C++ 类型后缀 _t、_type 或无

C++有时使用后缀_type关于类型定义(例如std::vector::value_type),有时_t(例如std::size_t),或者没有后缀(普通类,还有像std::string这样的类型定义,实际上是std::basic_string)对于何时使用哪个名称有什么好的约定吗? 最佳答案 正如@MarcoA.的回答正确指出的那样,后缀_t很大程度上继承自C(并且在全局命名空间中-为POSIX保留)。这给我们留下了“无后缀”和_type.请注意std中没有命名空间范围名称以_type结尾*;所有这些名称都是类和类模板的成员(或者

C++ 类型后缀 _t、_type 或无

C++有时使用后缀_type关于类型定义(例如std::vector::value_type),有时_t(例如std::size_t),或者没有后缀(普通类,还有像std::string这样的类型定义,实际上是std::basic_string)对于何时使用哪个名称有什么好的约定吗? 最佳答案 正如@MarcoA.的回答正确指出的那样,后缀_t很大程度上继承自C(并且在全局命名空间中-为POSIX保留)。这给我们留下了“无后缀”和_type.请注意std中没有命名空间范围名称以_type结尾*;所有这些名称都是类和类模板的成员(或者

c++ - c++中双括号 "[[foo()]] type name;"语法的含义?

在this关于避免虚假共享的文章,提供了以下对齐代码://C++(usingC++0xalignmentsyntax)templatestructcache_line_storage{[[align(CACHE_LINE_SIZE)]]Tdata;charpad[CACHE_LINE_SIZE>sizeof(T)?CACHE_LINE_SIZE-sizeof(T):1];};第4行是什么意思?我以前从未见过这种双括号语法。 最佳答案 那是attribute说明符语法。它是作为一种统一的语法引入的,用于访问以前特定于编译器的扩展(现在

c++ - c++中双括号 "[[foo()]] type name;"语法的含义?

在this关于避免虚假共享的文章,提供了以下对齐代码://C++(usingC++0xalignmentsyntax)templatestructcache_line_storage{[[align(CACHE_LINE_SIZE)]]Tdata;charpad[CACHE_LINE_SIZE>sizeof(T)?CACHE_LINE_SIZE-sizeof(T):1];};第4行是什么意思?我以前从未见过这种双括号语法。 最佳答案 那是attribute说明符语法。它是作为一种统一的语法引入的,用于访问以前特定于编译器的扩展(现在