![](/img/trans.png)
[英]Is this the right way to implement a return statement in a function? My function won't return a value
[英]auto Function with if Statement won't return a value
我制作了一個模板和一個自動函數,比較2個值並返回最小值。 這是我的代碼:
#include <iostream>
using namespace std;
// Template with a value returning function: PrintSmaller
template <typename T, typename U>
auto PrintSmaller(T NumOne, U NumTwo) {
if (NumOne > NumTwo) {
return NumTwo;
}
else {
return NumOne;
}
}
int main() {
int iA = 345;
float fB = 23.4243;
cout << PrintSmaller(iA, fB) << endl;
cout << PrintSmaller(fB, iA) << endl;
return 0;
}
但它不會編譯,我在VS 2015上得到這個錯誤: 錯誤C3487'int':所有返回表達式必須推導為相同的類型:以前它是'浮動'
但是,如果我刪除if語句並像這樣編寫PrintSmaller函數它沒有問題:
auto PrintSmaller(T NumOne, U NumTwo) {
return (NumOne < NumTwo ? NumOne : NumTwo);
}
有什么區別 ? 為什么第一個代碼不會編譯? 謝謝。
函數只能有一個return
類型。 使用return
類型推導意味着它將根據解析器看到的第一個 return
語句中的表達式類型推斷出來。 如果后面的return
語句不返回相同類型的表達式,則該函數被認為是自相矛盾的,因此是不正確的。
在第二種情況下, ?:
基於基於第二和第三子表達式確定的公共類型確定表達式的類型。 這兩個子表達式將轉換為此常見類型。
這與return
類型推導的工作方式不同。 如果您打算讓第一種情況起作用,那么您需要將返回的值顯式轉換為所需的返回類型。
正如您使用c ++ 11標記提出此問題,我想您正在使用C ++ 11。 不幸的是,C ++ 11標准規定自動類型推導(也適用於lambdas)僅限於單個語句。
由於?:
運算符是表達式而不是語句,因此if-else
是一個語句並且不符合要求時,這將起作用。
如果您要使用C ++ 14標准編譯此代碼,您將看到它應該編譯這兩個案例,因為此限制已被刪除。
直到昨天(2017-12-06),這還沒有在MSVC下進行編譯。 但是在VS 15.5更新后它確實如此。
auto msvc_does_compile = [](auto _string)
{
using string_type = decltype(_string);
return std::vector<string_type>{};
};
/*
OK since VS 2017 15.5 update
auto vec1 = msvc_does_compile( std::string{} );
*/
添加顯式返回類型會像往常一樣阻塞MSVC,但不會阻塞gcc / clang:
auto msvc_does_not_compile = [](auto _string)
// explicit return type makes msvc not to compile
-> std::vector< decltype(_string) >
{
using string_type = decltype(_string);
return std::vector<string_type>{};
};
即使在IDE階段,也會停止相同但更簡單的事情:
auto msvc_ide_does_not_allow = []( bool wide )
{
if (wide)
return std::vector<std::string>();
return std::vector<std::wstring>();
};
是的,再一次麻煩的對gcc / clang上面沒有問題。 試試你喜歡說服自己的在線ide ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.