小编fre*_*low的帖子

将对象声明为"最终"有什么意义?

我只是注意到可以final在Scala中声明对象:

final object O
Run Code Online (Sandbox Code Playgroud)

这样做有什么意义?无论如何,无法继承对象:

object A
object B extends A // not found: type A
Run Code Online (Sandbox Code Playgroud)

inheritance scala final object

39
推荐指数
2
解决办法
2830
查看次数

临时的一生

以下代码工作正常,但为什么这是正确的代码?为什么foo()返回的临时的"c_str()"指针有效?我想,当输入bar()时,这个临时性已经被破坏了 - 但它似乎不是这样的.那么,现在我假设foo()返回的临时值将在调用bar()之后被销毁 - 这是正确的吗?为什么?

std::string foo() {
  std::string out = something...;
  return out;
}

void bar( const char* ccp ) {
  // do something with the string..
}

bar( foo().c_str() );
Run Code Online (Sandbox Code Playgroud)

c++ temporary c++-faq lifetime full-expression

37
推荐指数
2
解决办法
3149
查看次数

具有反向语法的函数组合

如果我想申请f第一和g第二,我必须写:

g . f
Run Code Online (Sandbox Code Playgroud)

是否有另一种标准语法允许我以相反的顺序编写函数?

f <whatever> g
Run Code Online (Sandbox Code Playgroud)

我知道我可以发明自己的语法:

compose f g x = g (f x)
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

f `compose` g
Run Code Online (Sandbox Code Playgroud)

但我宁愿使用标准的库设施.

syntax haskell function-composition

37
推荐指数
1
解决办法
4492
查看次数

词法分析器与解析器之间的通信

每次我写一个简单的词法分析器和解析器时,我都会遇到同样的问题:词法分析器和解析器应该如何通信?我看到四种不同的方法:

  1. 词法分析器急切地将整个输入字符串转换为标记向量.完成此操作后,向量将被提供给解析器,解析器将其转换为树.这是迄今为止最简单的实现方案,但由于所有令牌都存储在内存中,因此浪费了大量空间.

  2. 每次词法分析器找到一个标记时,它会在解析器上调用一个函数,并传递当前标记.根据我的经验,这只有在解析器可以自然地实现为像LALR解析器这样的状态机时才有效.相比之下,我认为它对于递归下降解析器根本不起作用.

  3. 每次解析器需要一个令牌时,它会向词法分析器询问下一个令牌.由于yield关键字,这在C#中很容易实现,但在C++中却很难实现.

  4. 词法分析器和解析器通过异步队列进行通信.这在"生产者/消费者"这个标题下是众所周知的,它应该简化词法分析器和解析器之间的通信.它是否也优于多核上的其他解决方案?或者lexing太琐碎了?

我的分析听起来不错?还有其他我没有想过的方法吗?在现实世界的编译器中使用了什么?如果像Eric Lippert这样的编译器编写者可以对这个问题有所了解,那真的很酷.

c# c++ compiler-construction parsing lexer

37
推荐指数
2
解决办法
3041
查看次数

比较来自不同容器的迭代器

比较来自不同容器的迭代器是否合法?

std::vector<int> foo;
std::vector<int> bar;
Run Code Online (Sandbox Code Playgroud)

表达式是否会foo.begin() == bar.begin()产生错误或未定义的行为?

(我正在编写一个自定义迭代器,并在实现时偶然发现了这个问题operator==.)

c++ comparison iterator stl

36
推荐指数
1
解决办法
7595
查看次数

是否存在绝对需要typedef的情况?

请考虑安全bool习语的以下摘录:

typedef void (Testable::*bool_type)() const;
operator bool_type() const;
Run Code Online (Sandbox Code Playgroud)

是否可以在没有typedef的情况下声明转换函数?以下内容无法编译:

operator (void (Testable::*)() const)() const;
Run Code Online (Sandbox Code Playgroud)

c++ typedef type-conversion coercion safe-bool-idiom

36
推荐指数
1
解决办法
919
查看次数

在超级构造函数运行之前初始化字段?

在Java中,有没有办法在超级构造函数运行之前初始化字段?

即使是我能想到的最丑陋的黑客也会被编译器拒绝:

class Base
{
    Base(String someParameter)
    {
        System.out.println(this);
    }
}

class Derived extends Base
{
    private final int a;

    Derived(String someParameter)
    {
        super(hack(someParameter, a = getValueFromDataBase()));
    }

    private static String hack(String returnValue, int ignored)
    {
        return returnValue;
    }

    public String toString()
    {
        return "a has value " + a;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:当我从继承切换到委托时,问题就消失了,但我仍然想知道.

java inheritance constructor initialization constructor-chaining

36
推荐指数
4
解决办法
3万
查看次数

std :: initializer_list作为函数参数

出于某种原因,我认为C++ 0x允许std::initializer_list作为函数的函数参数,例如,期望可以从这样构造的类型std::vector.但显然,它不起作用.这只是我的编译器,还是永远不会起作用?是因为潜在的重载解决问题吗?

#include <string>
#include <vector>

void function(std::vector<std::string> vec)
{
}

int main()
{
    // ok
    std::vector<std::string> vec {"hello", "world", "test"};

    // error: could not convert '{"hello", "world", "test"}' to 'std::vector...'
    function( {"hello", "world", "test"} );
}
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list c++11

35
推荐指数
1
解决办法
2万
查看次数


由于我们已经移动了语义,所以特别推荐使用std :: swap吗?

可能重复:
移动语义==自定义交换功能已过时?

这就是std::swapC++ 11中的样子:

template<typename T>
void swap(T& x, T& y)
{
  T z = std::move(x);
    x = std::move(y);
    y = std::move(z);
}
Run Code Online (Sandbox Code Playgroud)

如果我的类定义了移动构造函数和移动赋值运算符,我还是必须专注std::swap于我自己的类型,或者它会std::swap尽可能高效吗?

c++ templates swap move-semantics c++11

35
推荐指数
1
解决办法
2万
查看次数