【发布时间】:2020-12-14 19:45:21
【问题描述】:
我发现惰性评估有很多用途,例如优化工具(例如matrices)。
另一个用途是语法糖。但是在我以运行时开销为代价让我的代码看起来更干净之前,编译器知道如何优化这种东西吗?还是应该只在潜在开销比不使用惰性评估更快时才使用它?
以下是我的意思的一个例子。这不是我的实际用例,只是 non-lazy 与 lazy eval 的简单版本。
// original
template < class out,
class in >
out && lazy_cast( in && i )
{
return ( out && )( i );
}
// usage
char c1 = 10;
int c2 = lazy_cast< int >( c1 );
// lazy
template < class in >
class C_lazy_cast
{
public:
in && i;
template < class out && >
operator out &&( )
{
return ( out && )( i );
}
};
template < class in >
C_lazy_cast< in > lazy_cast( in && i )
{
return { std::forward< in >( i ) };
}
// usage
char c1 = 10;
int c2 = lazy_cast( c1 );
为了完整起见,关于 MSVC、GCC 和 clang 的信息应该足够了。
【问题讨论】:
-
我不太明白你打算用
lazy_cast做什么。你...传递了一些参考资料?为什么不直接传递引用本身? -
@PasserBy 它只是 c 风格转换的包装器。理论上应该是0行代码。
-
但是你为什么不直接传递参考呢?演员不在使用点有什么意义?
-
@PasserBy 通过传递引用,我们可以消除对模板参数的需求,因为它们是在隐式转换期间推导出来的。
标签: c++ gcc visual-c++ clang