[英]How does type deduction work for evaluating expressions?
我只是使用模板做了鉗位功能。 看起來像這樣:
template <typename Tp_, typename Up_, typename Vp_>
inline auto clamp(Tp_ x, Up_ xmin, Vp_ xmax)
noexcept -> decltype(x < xmin ? xmin : (x > xmax ? xmax : x)) {
return x < xmin ? xmin : (x > xmax ? xmax : x);
}
template <typename Tp_, typename Up_>
inline auto clamp(Tp_ x, const Up_ &v) -> decltype(clamp(x, min(v),
max(v))) {
static_assert(is_iterable<Up_>::value,
"The data set must be iterable");
return clamp(x, min(v), max(v));
}
我有一個單元測試來測試執行此功能的功能:
TEST(StatsTest, clamp) {
ASSERT_EQ(clamp(1, 0, 5), 1);
ASSERT_EQ(clamp(-1, 0, 3), 0);
ASSERT_EQ(clamp(15, 0, 3), 3);
ASSERT_EQ(clamp(1, 0.f, 3.), 1);
ASSERT_EQ(clamp(-1, 0.f, 3.), 0.f);
ASSERT_EQ(clamp(15, 0, 3), 3.);
ASSERT_EQ(clamp(543, v1), 543);
ASSERT_EQ(clamp(-143, v1), 71);
ASSERT_EQ(clamp(14143, v1), 977);
}
但是,當我考慮它時,這沒有任何意義:在運行時間之前不應該知道decltype(clamp(x, min(v), max(v)))
,對嗎?
為了以防萬一,我嘗試用一些變量數據替換我的測試:
TEST(StatsTest, clamp) {
int a = 0;
float b = 65.3f;
double c = 89.7;
ASSERT_EQ(clamp(a, b, c), 65.3f);
}
但是它仍然過去了!
有什么解釋?
clamp
返回的類型是參數的常見類型,而不是所選參數的類型。
然后,您將被進一步的晉升所欺騙,從而使您的平等檢查得以擱置。
decltype( true?7:3.0 )
與decltype( false?7:3.0 )
具有相同的類型。
通常,您無法執行此操作。 在這種情況下起作用的唯一原因是因為您正在使用具有默認轉換的整數/浮點值。 例如:
float f;
int y;
double z;
std::cin >> f;
std::cin >> y;
std::cin >> z;
auto p = clamp(f, y, z);
static_assert(std::is_same<decltype(p), double>::value, "Not Double!");
這將起作用,因為可以將給定的所有類型提升為double
。 通常,如果您嘗試使用沒有這樣的提升的類型來執行此操作,則會出現編譯時錯誤,因為必須在編譯時知道函數的返回類型(當然必須知道),否則編譯器如何知道在堆棧上為返回值分配多少空間?)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.