ทุกอินสแตนซ์ของความแปลกนั้นจับคู่กับกรณีของจุดไข่ปลาปกติ
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes...)>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes......)>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes...) const>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes......) const>
{ typedef _Res result_type; };
ฉันเดาว่าจุดไข่ปลาคู่มีความหมายใกล้เคียงกัน_ArgTypes..., ...
นั่นคือการขยายเทมเพลตแบบแปรผันตามด้วยรายการ varargs สไตล์ C
นี่คือการทดสอบที่สนับสนุนทฤษฎีนั้น ... ฉันคิดว่าเรามีผู้ชนะรายใหม่สำหรับตัวดำเนินการหลอกที่แย่ที่สุดเท่าที่เคยมีมา
แก้ไข:สิ่งนี้ดูเหมือนจะสอดคล้องกัน §8.3.5 / 3 อธิบายวิธีหนึ่งในการสร้างรายการพารามิเตอร์เป็น
พารามิเตอร์-Declaration-list opt ... opt
ดังนั้นจุดไข่ปลาสองชั้นจึงถูกสร้างขึ้นโดยรายการการประกาศพารามิเตอร์ที่ลงท้ายด้วยแพ็กพารามิเตอร์ตามด้วยจุดไข่ปลาอื่น
เครื่องหมายจุลภาคเป็นทางเลือกเท่านั้น §8.3.5 / 4 พูด
ในกรณีที่ถูกต้องตามหลักไวยากรณ์และโดยที่“ ... ” ไม่ได้เป็นส่วนหนึ่งของผู้ประกาศนามธรรม“, ... ” มีความหมายเหมือนกับ“ ... ”
สิ่งนี้อยู่ใน abstract-declarator [แก้ไข]แต่ Johannes ได้ชี้ให้เห็นว่าพวกเขากำลังอ้างถึง abstract-declarator ภายในการประกาศพารามิเตอร์ ฉันสงสัยว่าทำไมพวกเขาถึงไม่พูดว่า "เป็นส่วนหนึ่งของการประกาศพารามิเตอร์" และเหตุใดประโยคนั้นจึงไม่เป็นเพียงบันทึกข้อมูล ...
นอกจากนี้va_begin()
ใน<cstdarg>
ต้องการพารามิเตอร์ก่อนรายการ varargs ดังนั้นต้นแบบที่f(...)
C ++ อนุญาตโดยเฉพาะจึงไม่มีประโยชน์ การอ้างอิงโยงกับ C99 ถือเป็นเรื่องผิดกฎหมายในภาษา C ธรรมดาดังนั้นนี่จึงเป็นเรื่องแปลกประหลาดที่สุด
หมายเหตุการใช้งาน
ตามคำขอนี่คือการสาธิตของจุดไข่ปลาคู่:
#include <cstdio>
#include <string>
template< typename T >
T const &printf_helper( T const &x )
{ return x; }
char const *printf_helper( std::string const &x )
{ return x.c_str(); }
template< typename ... Req, typename ... Given >
int wrap_printf( int (*fn)( Req... ... ), Given ... args ) {
return fn( printf_helper( args ) ... );
}
int main() {
wrap_printf( &std::printf, "Hello %s\n", std::string( "world!" ) );
wrap_printf( &std::fprintf, stderr, std::string( "Error %d" ), 5 );
}
...
...