我只是注意到可以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) 以下代码工作正常,但为什么这是正确的代码?为什么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) 如果我想申请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)
但我宁愿使用标准的库设施.
每次我写一个简单的词法分析器和解析器时,我都会遇到同样的问题:词法分析器和解析器应该如何通信?我看到四种不同的方法:
词法分析器急切地将整个输入字符串转换为标记向量.完成此操作后,向量将被提供给解析器,解析器将其转换为树.这是迄今为止最简单的实现方案,但由于所有令牌都存储在内存中,因此浪费了大量空间.
每次词法分析器找到一个标记时,它会在解析器上调用一个函数,并传递当前标记.根据我的经验,这只有在解析器可以自然地实现为像LALR解析器这样的状态机时才有效.相比之下,我认为它对于递归下降解析器根本不起作用.
每次解析器需要一个令牌时,它会向词法分析器询问下一个令牌.由于yield关键字,这在C#中很容易实现,但在C++中却很难实现.
词法分析器和解析器通过异步队列进行通信.这在"生产者/消费者"这个标题下是众所周知的,它应该简化词法分析器和解析器之间的通信.它是否也优于多核上的其他解决方案?或者lexing太琐碎了?
我的分析听起来不错?还有其他我没有想过的方法吗?在现实世界的编译器中使用了什么?如果像Eric Lippert这样的编译器编写者可以对这个问题有所了解,那真的很酷.
比较来自不同容器的迭代器是否合法?
std::vector<int> foo;
std::vector<int> bar;
Run Code Online (Sandbox Code Playgroud)
表达式是否会foo.begin() == bar.begin()产生错误或未定义的行为?
(我正在编写一个自定义迭代器,并在实现时偶然发现了这个问题operator==.)
请考虑安全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) 在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
出于某种原因,我认为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++是否存在差异?
有什么区别
T a(b);
Run Code Online (Sandbox Code Playgroud)
和
T a = b;
Run Code Online (Sandbox Code Playgroud)
和
T a = T(b);
Run Code Online (Sandbox Code Playgroud)
?
可能重复:
移动语义==自定义交换功能已过时?
这就是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尽可能高效吗?