C++ 自动功能,如果语句赢了';不返回值

C++ 自动功能,如果语句赢了';不返回值,c++,C++,我制作了一个模板和一个自动函数,用于比较两个值并返回最小值。 这是我的代码: #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 > NumTw

我制作了一个模板和一个自动函数,用于比较两个值并返回最小值。 这是我的代码:

#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;
}
#包括
使用名称空间std;
//带有值返回函数的模板:PrintSmaller
模板
自动打印更小(T NumOne,U NumTwo){
如果(NumOne>NumTwo){
返回NumTwo;
}
否则{
回归努蒙;
}
}
int main(){
int iA=345;
浮动fB=23.4243;

cout一个函数只能有一个
return
类型。使用
return
类型推断意味着它将根据解析器看到的第一个
return
语句中表达式的类型进行推断。如果后面的
return
语句没有返回相同类型的表达式,则该函数将被考虑d是自相矛盾的,因此是不正确的

在第二种情况下,
?:
根据根据第二和第三个子表达式确定的公共类型确定表达式的类型。这两个子表达式将转换为该公共类型


这与
return
类型推断的工作方式不同。如果您想让第一个案例起作用,那么您需要显式地将返回值转换为所需的返回类型。

正如您用c++11标记提出的这个问题,我想您使用的是c++11。不幸的是,c++11标准规定自动类型推断Action(也适用于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{} );
   */
auto-msvc\u-does\u-compile=[](自动字符串)
{
使用string_type=decltype(_string);
返回std::vector{};
};
/*
自VS 2017 15.5更新以来,一切正常
auto-vec1=msvc\u编译(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>{};
  };
auto-msvc\u不编译=[](自动字符串)
//显式返回类型使msvc无法编译
->标准::向量
{
使用string_type=decltype(_string);
返回std::vector{};
};
即使在IDE阶段,也会停止一些相同但更简单的操作:

    auto msvc_ide_does_not_allow = []( bool wide )
    {
       if (wide)
        return std::vector<std::string>();

        return std::vector<std::wstring>();
    };
auto-msvc\u ide\u不允许=[](布尔范围)
{
如果(宽)
返回std::vector();
返回std::vector();
};

是的,同样麻烦的gcc/clang对上述内容没有问题。请尝试您喜欢的在线ide…

三元语句可能会导致隐式转换。可能与此有关。您是使用-std=c++11还是-std=c++14编译的?对不起,我的错,我实际上正在使用VS 2015,我假设它使用最新的st标准c++14
    auto msvc_ide_does_not_allow = []( bool wide )
    {
       if (wide)
        return std::vector<std::string>();

        return std::vector<std::wstring>();
    };