草庐IT

c++ - void operator()() 的功能

我对voidoperator()()的功能感到困惑。你能告诉我,例如:classbackground_task{public:voidoperator()()const{do_something();do_something_else();}};background_taskf;std::threadmy_thread(f);这里,为什么我们需要operator()()?第一个和第二个()是什么意思?其实,普通算子的操作我都知道,但是这个算子比较困惑。 最佳答案 你可以重载()操作符来调用你的对象,就好像它是一个函数:classA{

c++ - bool vs void* 对同一个对象进行强制转换

下面的代码在if语句中使用时会打印“operatorbool”,而在函数调用需要bool时会打印“operatorvoid*”。为什么不使用operatorbool进行函数调用呢?以及如何让它在这两种情况下都使用它?#includeclassA{public:explicitoperatorbool()const{std::cout 最佳答案 在if语句中,会考虑隐式和显式转换运算符。因为A有一个operatorbool,它会选择那个,因为它比将A转换为void*然后将其转换为bool.但在其他不是条件的语句(if、while、..

c++ - bool vs void* 对同一个对象进行强制转换

下面的代码在if语句中使用时会打印“operatorbool”,而在函数调用需要bool时会打印“operatorvoid*”。为什么不使用operatorbool进行函数调用呢?以及如何让它在这两种情况下都使用它?#includeclassA{public:explicitoperatorbool()const{std::cout 最佳答案 在if语句中,会考虑隐式和显式转换运算符。因为A有一个operatorbool,它会选择那个,因为它比将A转换为void*然后将其转换为bool.但在其他不是条件的语句(if、while、..

c++ - 使用 void_t 的多个 SFINAE 类模板特化

当每个类模板特化仅在涉及非推导上下文中的模板参数的模式之间是不同的时,多个类模板特化是否有效?std::void_t的一个常见示例使用它来定义一个特征,该特征揭示一个类型是否有一个名为“type”的成员typedef。在这里,采用了单一的特化。这可以扩展来识别一个类型是否有或者一个名为“type1”的成员typedef,或者一个名为“type2”的成员。下面的C++1z代码使用GCC编译,但不是Clang。合法吗?template>structhas_members:std::false_type{};templatestructhas_members>:std::true_type{

c++ - 使用 void_t 的多个 SFINAE 类模板特化

当每个类模板特化仅在涉及非推导上下文中的模板参数的模式之间是不同的时,多个类模板特化是否有效?std::void_t的一个常见示例使用它来定义一个特征,该特征揭示一个类型是否有一个名为“type”的成员typedef。在这里,采用了单一的特化。这可以扩展来识别一个类型是否有或者一个名为“type1”的成员typedef,或者一个名为“type2”的成员。下面的C++1z代码使用GCC编译,但不是Clang。合法吗?template>structhas_members:std::false_type{};templatestructhas_members>:std::true_type{

c++ - `inline` 和 `template<class = void>` 之间有什么实际区别?

我们有2种方法可以在仅header库中声明函数。他们是inline和template.在boostsourcecode我可以看到这两种变体。示例如下:inlinevoidmy_header_only_function(void){//Dosomething...return;}templatevoidmy_header_only_function(void){//Dosomething...return;}我知道根据C++标准有什么区别。但是,任何C++编译器都不仅仅是标准的,而且标准也经常不清楚。在从不使用模板参数并且与递归可变参数模板无关的情况下,主流编译器的2个变体之间是否存在(

c++ - `inline` 和 `template<class = void>` 之间有什么实际区别?

我们有2种方法可以在仅header库中声明函数。他们是inline和template.在boostsourcecode我可以看到这两种变体。示例如下:inlinevoidmy_header_only_function(void){//Dosomething...return;}templatevoidmy_header_only_function(void){//Dosomething...return;}我知道根据C++标准有什么区别。但是,任何C++编译器都不仅仅是标准的,而且标准也经常不清楚。在从不使用模板参数并且与递归可变参数模板无关的情况下,主流编译器的2个变体之间是否存在(

c++ - 使用 new 时将指针转换为 void* 的优势

STL_construct.h有如下功能:templateinlinevoid_Construct(_T1*__p,const_T2&__value){::new(static_cast(__p))_T1(__value);}我想知道为什么需要将__p强制转换为void*,有什么好处吗? 最佳答案 它保证调用预定义的放置new运算符,而不是由带有签名void*operatornew(std::size_t,_T1*)的用户代码添加到全局命名空间的任何重载. 关于c++-使用new时将指针

c++ - 使用 new 时将指针转换为 void* 的优势

STL_construct.h有如下功能:templateinlinevoid_Construct(_T1*__p,const_T2&__value){::new(static_cast(__p))_T1(__value);}我想知道为什么需要将__p强制转换为void*,有什么好处吗? 最佳答案 它保证调用预定义的放置new运算符,而不是由带有签名void*operatornew(std::size_t,_T1*)的用户代码添加到全局命名空间的任何重载. 关于c++-使用new时将指针

java - 返回类型为 void 的方法应该使用 return 语句吗?

我知道有时使用return;可以在Java中发挥有用的作用,例如保护:publicvoidfoo(Barbar){if(bar==null)return;//barisnotnull,goaheadanddostuffwithit}但是,如果只是到达返回类型为void的方法的末尾呢?例如,publicvoidprintMenu(){System.out.println("Printoutsomeboilerplateinfohere,line1.");System.out.println("Printoutsomeboilerplateinfohere,line2.");System.