小编hps*_*use的帖子

rvalue结构的成员是右值还是左值?

返回结构的函数调用是一个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是左值还是左值的说法.
那么,它是什么?

c++ structure rvalue lvalue

26
推荐指数
1
解决办法
2567
查看次数

重新包装monad - 任何通用方式?

给定两个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)

monads haskell

13
推荐指数
2
解决办法
431
查看次数

为什么指针类型的内置关系运算符不能在C++中生成总顺序?

我知道指针的关系运算符仅在有限的情况下提供可靠的结果,并且不保证它们生成总订单.但是,这些运算符的标准函数对象确实具有生成总订单的特殊化.

那么是什么阻止了同样的规则申请内置运营商?这似乎没有简化任何事情,因为仍然需要可靠的比较(通过一些特定于实现的方法)来使这些函数对象起作用.

此外,是否可以对仅具有内置运算符的指针进行可靠的比较?虽然看起来不可能,但我想在此确认一下.

c++ comparison pointers

7
推荐指数
1
解决办法
147
查看次数

如何从 ext2/ext3 文件系统上的稀疏文件中删除一些块

当您编写稀疏文件时,ext2/ext3 文件系统会自动分配块,但是当我不再需要它们的某些块时,我发现没有办法做到这一点。感觉就像在没有 free() 的情况下使用 malloc()。是否可以“释放”稀疏文件的某些块?如果是,如何?不要告诉我将其复制到新文件中。这太无聊了,需要大量的磁盘空间。

linux filesystems

5
推荐指数
1
解决办法
2258
查看次数

Visual C++编译器允许dependent-name作为没有"typename"的类型?

今天我的一位朋友告诉我,以下代码在他的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的扩展?

c++ templates dependent-name visual-c++

5
推荐指数
1
解决办法
394
查看次数

如何使用unsafeInterleaveIO处理异常?

假设我要打开一个文件并解析其内容,我想懒得这样做:

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.但是在这种情况下,正常的异常处理方法将导致在实际读取过程开始之前关闭文件句柄.那当然不能接受.

那么,释放一些需要远离其范围的资源的常见方法是因为懒惰,就像我正在做的那样,并且仍然确保异常安全?

haskell exception lazy-evaluation

5
推荐指数
1
解决办法
121
查看次数