返回结构的函数调用是一个rvalue表达式,但它的成员呢?
这段代码适用于我的g ++编译器,但是gcc给出了一个错误,说"左值作为赋值的左操作数":
struct A
{
int v;
};
struct A fun()
{
struct A tmp;
return tmp;
}
int main()
{
fun().v = 1;
}
Run Code Online (Sandbox Code Playgroud)
gcc视为fun().v右值,我能理解.
但是g ++并不认为赋值表达式是错误的.这是否意味着fun1().v是C++中的左值?
现在的问题是,我搜索了C++ 98/03标准,没有找到关于fun().v是左值还是左值的说法.
那么,它是什么?
给定两个monad,Monad m并且Monad n,我想转换m (n a)成n (m a).但似乎是因为两者没有通用的方法(>>=)和return交易只有一个单子类型,虽然(>>=)允许提取一个单子的内容,则必须收拾他们回到同一个单子类型,以便它可以是一个结果值.
但是,如果我们设置m为固定类型,则工作变得容易.以Maybe为例:
reorder :: (Monad n) => Maybe (n a) -> n (Maybe a)
reorder Nothing = return Nothing
reorder (Just x) = do
x' <- x
return $ Just x'
Run Code Online (Sandbox Code Playgroud)
或者列表:
reorder :: (Monad n) => [n a] -> n [a]
reorder [] = return []
reorder (x:xs) = do
x' <- x
xs' <- …Run Code Online (Sandbox Code Playgroud) 我知道指针的关系运算符仅在有限的情况下提供可靠的结果,并且不保证它们生成总订单.但是,这些运算符的标准函数对象确实具有生成总订单的特殊化.
那么是什么阻止了同样的规则申请内置运营商?这似乎没有简化任何事情,因为仍然需要可靠的比较(通过一些特定于实现的方法)来使这些函数对象起作用.
此外,是否可以对仅具有内置运算符的指针进行可靠的比较?虽然看起来不可能,但我想在此确认一下.
当您编写稀疏文件时,ext2/ext3 文件系统会自动分配块,但是当我不再需要它们的某些块时,我发现没有办法做到这一点。感觉就像在没有 free() 的情况下使用 malloc()。是否可以“释放”稀疏文件的某些块?如果是,如何?不要告诉我将其复制到新文件中。这太无聊了,需要大量的磁盘空间。
今天我的一位朋友告诉我,以下代码在他的Visual Studio 2008上编译得很好:
#include <vector>
struct A
{
static int const const_iterator = 100;
};
int i;
template <typename T>
void PrintAll(const T & obj)
{
T::const_iterator *i;
}
int main()
{
std::vector<int> v;
A a;
PrintAll(a);
PrintAll(v);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我通常使用g ++,它总是拒绝传递第二个PrintAll()调用.据我所知,对于这个问题,g ++正在以标准的方式翻译模板.
那么,我的知识是错误的,还是VS2008的扩展?
假设我要打开一个文件并解析其内容,我想懒得这样做:
parseFile :: FilePath -> IO [SomeData]
parseFile path = openBinaryFile path ReadMode >>= parse' where
parse' handle = hIsEOF handle >>= \eof -> do
if eof then hClose handle >> return []
else do
first <- parseFirst handle
rest <- unsafeInterleaveIO $ parse' handle
return (first : rest)
Run Code Online (Sandbox Code Playgroud)
如果在整个阅读过程中没有发生错误,上面的代码就可以了.但是如果抛出异常,就没有机会执行hClose,并且句柄将无法正确关闭.
通常,如果IO进程不是惰性的,则可以通过catch或轻松解决异常处理问题bracket.但是在这种情况下,正常的异常处理方法将导致在实际读取过程开始之前关闭文件句柄.那当然不能接受.
那么,释放一些需要远离其范围的资源的常见方法是因为懒惰,就像我正在做的那样,并且仍然确保异常安全?
c++ ×3
haskell ×2
comparison ×1
exception ×1
filesystems ×1
linux ×1
lvalue ×1
monads ×1
pointers ×1
rvalue ×1
structure ×1
templates ×1
visual-c++ ×1