C++ 在临时之前调用的析构函数应超出范围
我有一些代码在VS2015下失败,但在GCC下工作。我很确定这个bug是VisualStudio的,但是我想确定我对decltype(auto)的理解是正确的C++ 在临时之前调用的析构函数应超出范围,c++,auto,c++14,decltype,visual-studio-2015,C++,Auto,C++14,Decltype,Visual Studio 2015,我有一些代码在VS2015下失败,但在GCC下工作。我很确定这个bug是VisualStudio的,但是我想确定我对decltype(auto)的理解是正确的 #include <iostream> using namespace std; string zero_params() { return "zero_params called."; } template< typename F > auto test1( F f ) -> decltype(au
#include <iostream>
using namespace std;
string zero_params()
{
return "zero_params called.";
}
template< typename F >
auto test1( F f ) -> decltype(auto)
{
return f();
}
int main() {
cout << std::is_rvalue_reference< decltype(test1(zero_params)) >::value << endl;
cout << test1(zero_params) << endl;
cout << "Done!" << endl;
return 0;
}
#包括
使用名称空间std;
字符串零参数()
{
返回“调用零个参数。”;
}
模板
自动测试1(F)->decltype(自动)
{
返回f();
}
int main(){
cout::value因此我们可以得出以下结论:
- 这是VS2015预览版中的一个错误
- 有一些变通办法
问题在于:
- 编译器应该将返回类型推断为字符串
- 它实际上推断它是字符串&&
- 因此,它过早地破坏了价值
解决办法是:
- 不要对函数的返回类型使用decltype(auto)
- 在传入函数之前,将其包装在lambda表达式中
正确,f()
是一个PR值,因此decltype
应该推断std::string
而不是std::string&
。请提交错误报告并在此处发布链接。如果decltype(自动),在VS2015转到RTM之前确实需要修复此问题
并非无用……不幸的是,MS Connect告诉我,我无权提交错误报告。但在Visual Studio中,我已经做了下一件最好的事情——使用他们的“皱眉脸”提交反馈,包括测试代码的屏幕截图和说明。不幸的是,我认为这不符合要求hod是可跟踪的?希望有人把它传递给正确的部门WSA这在VS2015预览版或VS2015 CTP5中?如果你能给我一个屏幕截图,我可以为你提交错误报告。然后我会在答案中包含一个可跟踪的链接。请不要把答案放在评论中,伙计们。这篇文章是随后打破模型的完美例子。我们在评论中有事实(可以随时消失),半个答案没有提供任何证据,而是交叉引用评论(可以随时消失)。如果您想在回答问题之前与同事讨论问题,请尝试聊天室!!我们可以将这些评论整合到此答案中吗?评论是暂时的。
cout << test1(zero_params) << endl;
cout << test1( [](auto&&... ps) { return zero_params(std::forward<decltype(ps)>(ps)...); } ) << endl;