Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有DECKET的C++ 11尾随返回类型不能正常工作_C++_C++11_Templates_Decltype_Trailing Return Type - Fatal编程技术网

带有DECKET的C++ 11尾随返回类型不能正常工作

带有DECKET的C++ 11尾随返回类型不能正常工作,c++,c++11,templates,decltype,trailing-return-type,C++,C++11,Templates,Decltype,Trailing Return Type,为什么这会像预期的那样有效? 我的理解是,这不应该起作用: template <class T, class U> auto x(T a, U b) -> decltype(a<b ? a:b) { return a > b ? a : b; } int main() { cout << x<long, double>(1, 2.01) << endl; cout << x<long,

为什么这会像预期的那样有效? 我的理解是,这不应该起作用:

template <class T, class U>
auto x(T a, U b) -> decltype(a<b ? a:b) {
    return a > b ? a : b;
}


int main() {
    cout << x<long, double>(1, 2.01) << endl;
    cout << x<long, double>(5, 2.01) << endl;

}
这是意料之中的。我的理解是,第一个函数也应该失败,并出现相同的错误,而它工作正常。

您可能会认为

样板 自动文本a、U b->文本类型ab?a:b; } 你可能认为

样板 自动文本a、U b->文本类型ab?a:b; }
std::cout与?:运算符的条件无关。结果类型作为第二个和第三个操作数的公共类型计算。下面是如何计算?:运算符的公共类型和值类别的一部分,有关完整详细信息,请参阅:

如果第二个和第三个操作数是同一类型的左值,则结果类型将是该类型的左值

如果类型是不相关的左值,则有一些更复杂的规则来确定公共类型,但结果将是prvalue,而不是左值。特别是,如果这两种类型都是算术类型,例如double和long,则应用。在long和double的情况下,常见的类型是double。这与使用+添加两种不同的算术类型时进行的类型计算相同,因此称为“常用算术转换”


因此,decltypea与?:运算符的条件无关。结果类型作为第二个和第三个操作数的公共类型计算。下面是如何计算?:运算符的公共类型和值类别的一部分,有关完整详细信息,请参阅:

如果第二个和第三个操作数是同一类型的左值,则结果类型将是该类型的左值

如果类型是不相关的左值,则有一些更复杂的规则来确定公共类型,但结果将是prvalue,而不是左值。特别是,如果这两种类型都是算术类型,例如double和long,则应用。在long和double的情况下,常见的类型是double。这与使用+添加两种不同的算术类型时进行的类型计算相同,因此称为“常用算术转换”



因此,DecltypeA你期望什么,实际的行为是什么,它以什么方式不能满足你的期望?我不清楚您到底在问什么。与任何表达式一样,表达式也需要注意,如果使用相同类型的两个参数调用函数,则该函数具有未定义的行为。不要用它。如果您删除了尾部的decltype,就可以了。。。返回类型或在其周围添加了std::decation\t。实际上,第二个组合失败,出现编译时错误:严重性代码描述项目文件行抑制状态错误C2440'return':无法从'U'转换为't&'。但是如果你在decltype中看到min被写入,而它仍然计算max。你期望的是什么,实际的行为是什么,它以什么方式不能满足你的期望?我不清楚您到底在问什么。与任何表达式一样,表达式也需要注意,如果使用相同类型的两个参数调用函数,则该函数具有未定义的行为。不要用它。如果您删除了尾部的decltype,就可以了。。。返回类型或在其周围添加了std::decation\t。实际上,第二个组合失败,出现编译时错误:严重性代码描述项目文件行抑制状态错误C2440'return':无法从'U'转换为't&'。但是如果你在decltype中看到min被写入,而它仍然计算max。问题是,在第一种情况下,我们有完全相同的问题,因为它返回U而不是T&但它仍然编译。问题是,在第一种情况下,我们有完全相同的问题,因为它不是T而是返回U&但它仍然编译。但是如果它不是引用类型,我们仍然会在双到长转换的情况下得到警告,因为结果应该是整数,而我们在输出中看到的是双结果,这意味着引用已被传递,或者可能是因为公共类型?而且还不太清楚什么是公共类型。你能提供更多关于这个的细节吗?@user2420079完整而复杂的细节在我在问题中提供的链接中。对于两种不同的算术类型,如long和double,将应用通常的算术转换来获得通用类型,请参阅。特别是常见的长型和双型是双。如果long参数作为较大的值返回,它将被转换为double
till将在双到长转换的情况下得到警告,因为结果应该是整数,而我们在输出中看到双结果,这意味着引用已被传递,或者可能是因为公共类型?并且还不太清楚什么是公共类型。你能提供更多关于这个的细节吗?@user2420079完整而复杂的细节在我在问题中提供的链接中。对于两种不同的算术类型,如long和double,将应用通常的算术转换来获得通用类型,请参阅。特别是常见的长型和双型是双。如果long参数作为较大的值返回,它将转换为double。
template <class T, class U>
auto x(T a, U b) -> decltype(a<b ? a:a) {
    return a > b ? a : b;
}
compile time error:  Error C2440 'return': cannot convert from 'U' to 'T &'