ผมเล่นรอบกับในauto
std::pair
ในรหัสด้านล่างฟังก์ชั่นf
ควรจะส่งกลับstd::pair
ประเภทซึ่งขึ้นอยู่กับพารามิเตอร์แม่แบบ
ตัวอย่างการทำงาน:
ตัวอย่าง 1
template <unsigned S>
auto f()
{
if constexpr (S == 1)
return std::pair{1, 2}; // pair of ints
else if constexpr (S == 2)
return std::pair{1.0, 2.0}; // pair of doubles
else
return std::pair{0.0f, 0.0f}; // pair of floats
}
ใช้งานได้กับ gcc 9.2, gcc 10.0, clang 9.0 และ clang 10.0
ถัดไปฉันต้องการเขียนประเภทส่งคืนอย่างstd::pair
ชัดเจนเพื่อเหตุผลที่ชัดเจน:
ตัวอย่าง 2
template <unsigned S>
std::pair<auto, auto> f()
{
if constexpr (S == 1)
return {1, 2};
/* ... */
}
ทั้ง gcc 9.2 / 10.0 และเสียงดังกราว 9.0 / 10.0 ล้มเหลวในการรวบรวม
gcc 9.2
error: invalid use of 'auto'
error: template argument 1 is invalid // first argument (auto) of std::pair
error: template argument 2 is invalid // second argument (auto) of std::pair
error: cannot convert '<brace-enclosed initializer list>' to 'int' in return
จากข้อผิดพลาดที่ผ่านมา GCC 9.2 ดูเหมือนจะเชื่อว่าเป็นstd::pair<auto, auto>
int
สิ่งนี้จะอธิบายได้อย่างไร?
gcc 10.0
error: returning initializer list
ข้อผิดพลาดนี้เป็นที่เข้าใจได้ แต่ฉันคาดว่าตัวสร้างของstd::pair
จะถูกเรียกหรือมีบางสิ่งที่ฉันหายไปที่นี่?
เสียงดังกราว 9.0 และ 10.0
'auto' not allowed in template argument
excess elements in scalar initializer
no matching function for call to 'f'
โอเคเสียงดังกราวไม่ชอบสิ่งนี้ int
จากข้อผิดพลาดที่สองมันก็ดูเหมือนว่าเสียงดังกราวยังเชื่อชนิดกลับเป็น
สุดท้ายเพื่อแก้ไขข้อผิดพลาดที่ได้รับจากการรวบรวมด้วย gcc 10.0 ฉันตัดสินใจกลับมาstd::pair
อย่างชัดเจน:
ตัวอย่าง 3
template <unsigned S>
std::pair<auto, auto> f()
{
if constexpr (S == 1)
return std::pair{1, 2};
/* ... */
}
เสียงดังกราว 9.0 และ 10.0
เหมือนเมื่อก่อน แต่มีเพิ่มเติม:
no viable conversion from returned value of type 'std::pair<int, int>' to function return type 'int'
เสียงดังกราวยังคงคิดว่าเราจะกลับมาint
?
gcc 9.2
เหมือนเมื่อก่อน.
gcc 10.0
มันได้ผล!
ฉันเดาว่าคุณสมบัติบางอย่างยังคงต้องถูกนำไปใช้หรือในสถานการณ์อย่างใดอย่างหนึ่งที่อธิบายไว้ข้างต้นมีคอมไพเลอร์ที่ถูกและผิดหรือเปล่า? ในความคิดของฉันตัวอย่าง 2 ควรทำงาน หรือไม่ควร?