小编Pup*_*ppy的帖子

198
推荐指数
6
解决办法
2万
查看次数

字符串前面的'L'在C++中意味着什么?

this->textBox1->Name = L"textBox1";
Run Code Online (Sandbox Code Playgroud)

虽然它似乎没有L,但前缀的目的是什么?它的使用方式对于核心C程序员来说甚至都没有意义.

c++

152
推荐指数
6
解决办法
8万
查看次数

const char*和char const* - 它们是一样的吗?

根据我的理解,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++ pointers const

79
推荐指数
5
解决办法
3万
查看次数

在f(x)中,可以在f之前评估x吗?

我有一个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
标准报价适用.
我知道参数的评估顺序是不合理的,但我不记得调用函数对象的顺序是什么.

c++ c++11

52
推荐指数
2
解决办法
2310
查看次数

在Doom 3 BFG代码中计算Sqrt(x)为x*InvSqrt(x)是否有意义?

我浏览了最近发布的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++ optimization math.h micro-optimization

44
推荐指数
2
解决办法
2492
查看次数

C++ ABI问题列表

我已经看到很多关于C++如何没有标准ABI的讨论与C一样.我很好奇究竟是什么问题.到目前为止,我已经想到了

  1. 名字错误
  2. 异常处理
  3. RTTI

还有其他与C++有关的ABI问题吗?

c++

43
推荐指数
4
解决办法
9210
查看次数

Rebase只是分支的一部分

我有两个分支(和主人).分支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)

git

41
推荐指数
3
解决办法
7875
查看次数

是C#的lambda表达式语法LALR(1)?

我想问的问题在标题中简明扼要.让我举一个问题语法的例子:

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向前看比正常情况更进一步.

c# parsing lalr

35
推荐指数
3
解决办法
2085
查看次数

传递const char*作为模板参数

为什么你不能在这里传递文字字符串?我使用了一个非常轻微的解决方法.

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)

c++ string templates

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

enable_shared_from_this和继承

我有一个继承自的类型enable_shared_from_this<type>,以及从这种类型继承的另一种类型.现在我不能使用shared_from_this方法,因为它返回基类型,并且在特定的派生类方法中我需要派生类型.从这个直接构造shared_ptr是否有效?

编辑:在一个相关的问题中,我如何从一个类型的左值移动shared_ptr<base>到一个类型shared_ptr<derived>?我使用dynamic_cast来验证它确实是正确的类型,但现在我似乎无法完成实际的移动.

c++ boost smart-pointers shared-ptr c++11

27
推荐指数
1
解决办法
6204
查看次数