为什么标准定义end()为一个结束而不是实际结束?
this->textBox1->Name = L"textBox1";
Run Code Online (Sandbox Code Playgroud)
虽然它似乎没有L,但前缀的目的是什么?它的使用方式对于核心C程序员来说甚至都没有意义.
根据我的理解,const修饰符应该从右到左阅读.从那以后,我明白了:
const char*
Run Code Online (Sandbox Code Playgroud)
是一个指针,其char元素不能被修改,但指针本身可以,和
char const*
Run Code Online (Sandbox Code Playgroud)
是一个指向mutable字符的常量指针.
但是我得到以下代码的以下错误:
const char* x = new char[20];
x = new char[30]; //this works, as expected
x[0] = 'a'; //gives an error as expected
char const* y = new char[20];
y = new char[20]; //this works, although the pointer should be const (right?)
y[0] = 'a'; //this doesn't although I expect it to work
Run Code Online (Sandbox Code Playgroud)
那么是哪一个呢?我的理解还是我的编译器(VS 2005)错了?
我有一个C++程序.这个程序做了这样的事情:
struct MyT {void memfunc(std::unique_ptr<MyT> arg);};
std::unique_ptr<MyT> obj = /* some init */;
obj->memfunc(std::move(obj));
Run Code Online (Sandbox Code Playgroud)
这保证是有效的,还是我最终可以调用成员函数nullptr?
标准报价适用.
我知道参数的评估顺序是不合理的,但我不记得调用函数对象的顺序是什么.
我浏览了最近发布的Doom 3 BFG源代码,当时我遇到了一些似乎没有任何意义的东西.Doom 3在idMath类中包含数学函数.一些函数只是向相应的函数提供math.h,但有些是重新实现(例如idMath :: exp16()),我认为它具有比它们的math.h对应物更高的性能(可能以牺牲精度为代价).
然而,令我感到困惑的是他们实现这一float idMath::Sqrt(float x)功能的方式:
ID_INLINE float idMath::InvSqrt( float x ) {
return ( x > FLT_SMALLEST_NON_DENORMAL ) ? sqrtf( 1.0f / x ) : INFINITY;
}
ID_INLINE float idMath::Sqrt( float x ) {
return ( x >= 0.0f ) ? x * InvSqrt( x ) : 0.0f;
}
Run Code Online (Sandbox Code Playgroud)
这似乎执行两个不必要的浮点运算:首先是除法然后是乘法.
值得注意的是,原始的Doom 3源代码也以这种方式实现了平方根函数,但是反平方根使用了快速平方根算法.
ID_INLINE float idMath::InvSqrt( float x ) {
dword …Run Code Online (Sandbox Code Playgroud) 我已经看到很多关于C++如何没有标准ABI的讨论与C一样.我很好奇究竟是什么问题.到目前为止,我已经想到了
还有其他与C++有关的ABI问题吗?
我有两个分支(和主人).分支2基于分支1是基于主.我已经提交了分支1进行审核,它有一些更改,我将其中一些更改重新编入历史记录并将结果合并到主数据中.
现在我需要在master上重新设置Branch 2以准备审查/合并.
问题是分支2仍然包含分支1的原始提交,它不再存在,因此git会混淆.我尝试使用rebase -i删除Branch 1的原始提交,但是Branch 2的提交不基于master-before-branch-1.
我需要做的是采取分支2,删除一些提交,并在一次操作中仅重新设置master上的剩余提交.但我只知道如何在两个不同的步骤中完成这两项操作.
我怎样才能将我的分支部分重新分支到另一个分支,删除所有不具有共同祖先的提交,除了我指定的那些(例如从HEAD~2起)?
这是当前状态:
master new branch 1
- - - - - - - - - - - | - - - - - - - - -
\
\ branch 1
\ _ _ _ _ _ _ _
\
\ branch 2
\ _ _ _ _ _ _ _
Run Code Online (Sandbox Code Playgroud)
我最终想要的是:
master new branch 1
- - - - - - - | - - - - - - - - …Run Code Online (Sandbox Code Playgroud) 我想问的问题在标题中简明扼要.让我举一个问题语法的例子:
identifier_list
: identifier
| identifier_list identifier;
lambda_arguments
: '(' identifier_list ')'
| identifier;
lambda
: lambda_arguments '=>' expression
Run Code Online (Sandbox Code Playgroud)
然后我们添加正常的C表达式语法 - 特别是
primary_expression
: '(' expression ')'
| identifier
| lambda;
Run Code Online (Sandbox Code Playgroud)
真正的问题是,这个语法LALR(1)是否可解析,即能够被自动解析器生成器解析?或者它需要手动或GLR解析器?请注意,我希望特别了解此小节,而不是上下文相关的关键字内容或任何其他部分.
我现在想的是,如果解析器看到'(' identifier ')',它有两个有效的解析,所以如果解析器看到identifier,向前看')',它将无法决定哪个解析树失效.这可能只是一个转移/减少冲突,我可以通过分配一些任意优先权(可能是有利的'(' identifier ')')来消除.
编辑:实际上,我正在考虑使用这个语法小节来窃取新语言中的类似功能.我已经在语法形式上有类似于JavaScript的匿名函数,但我的豚鼠吱吱声反馈抱怨它们对于许多用途而言过于冗长,并且指出C#lambda表达式是更理想的解决方案.我担心这个解决方案可能导致模糊不清.所以,真的,我只对那个小节感兴趣.其他东西,如泛型和演员表对我来说都不是问题.
以前版本的语法都是机械可解析的,我不想失去这个属性,而我之前使用机械发生器的经验告诉我,最好先检查这里,而不是试试自己.对于我的手动解析器,我当然可以通过特殊情况'(' identifier向前看比正常情况更进一步.
为什么你不能在这里传递文字字符串?我使用了一个非常轻微的解决方法.
template<const char* ptr> struct lols {
lols() : i(ptr) {}
std::string i;
};
class file {
public:
static const char arg[];
};
decltype(file::arg) file::arg = __FILE__;
// Getting the right type declaration for this was irritating, so I C++0xed it.
int main() {
// lols<__FILE__> hi;
// Error: A template argument may not reference a non-external entity
lols<file::arg> hi; // Perfectly legal
std::cout << hi.i;
std::cin.ignore();
std::cin.get();
}
Run Code Online (Sandbox Code Playgroud) 我有一个继承自的类型enable_shared_from_this<type>,以及从这种类型继承的另一种类型.现在我不能使用shared_from_this方法,因为它返回基类型,并且在特定的派生类方法中我需要派生类型.从这个直接构造shared_ptr是否有效?
编辑:在一个相关的问题中,我如何从一个类型的左值移动shared_ptr<base>到一个类型shared_ptr<derived>?我使用dynamic_cast来验证它确实是正确的类型,但现在我似乎无法完成实际的移动.