簡體   English   中英

auto if if語句不會返回值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM