相关疑难解决方法(0)

Variadic模板包扩展

我正在尝试学习可变参数模板和函数.我无法理解为什么这段代码不能编译:

template<typename T>
static void bar(T t) {}

template<typename... Args>
static void foo2(Args... args)
{
    (bar(args)...);
}

int main()
{
    foo2(1, 2, 3, "3");
    return 0;    
}
Run Code Online (Sandbox Code Playgroud)

当我编译它失败时出现错误:

错误C3520:'args':必须在此上下文中扩展参数包

(在功能上foo2).

c++ templates variadic-templates c++11

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

&(int){1}在C++中的含义是什么?

我在这里看到了这个,我不知道这意味着什么:

&(int) { 1 }
Run Code Online (Sandbox Code Playgroud)

我觉得这很奇怪,因为它似乎是无效的语法.它正在构建一个块范围(?),中间有一个随机1(没有分号)并取地址.对我来说没有多大意义.你们能开导我吗?

尝试用C++ 11,所以它编译:

auto a = &(int) { 1 };
Run Code Online (Sandbox Code Playgroud)

但我不知道如何处理变量.

c++ c99

29
推荐指数
2
解决办法
2892
查看次数

这是无效的C++吗?

struct HybridExpression {
    RawExpressionElement *ree;
    ExpressionNode *en;
};    

vector<HybridExpression> hexpression;

hexpression.insert(hexpression.begin() + starti, 
        (HybridExpression) {NULL, en}); 
Run Code Online (Sandbox Code Playgroud)

gcc在没有警告的情况下构建,但Visual Studio 2010甚至无法编译它.

它不喜欢这一点: (HybridExpression) {NULL, en}

c++

12
推荐指数
1
解决办法
2277
查看次数

MSVC中的复合文字

在海湾合作委员会,我能够做到这一点:

(CachedPath){ino}
inode->data = (struct Data)DATA_INIT;
Run Code Online (Sandbox Code Playgroud)

哪里:

struct CachedPath
{
    Ino ino;
};

typedef int8_t Depth;
struct Data
{
    Offset size;
    Blkno root;
    Depth depth;
};
#define DATA_INIT {0, -1, 0}
Run Code Online (Sandbox Code Playgroud)

MSVC为这些类型的转换提供以下错误:

error C2143: syntax error : missing ';' before '{'
Run Code Online (Sandbox Code Playgroud)

我怎样才能在MSVC中这样做?进一步注意,代码已经从C99转换而来,我为此使用了指定的初始值设定项,然后进行类似的转换.关于C99与C++的MSVC/GCC实现之间如何关联这些各种特征的任何清晰都是值得赞赏的.

c c++ gcc struct visual-studio-2010

8
推荐指数
1
解决办法
3890
查看次数

哪个 GCC 功能可以编译 (const T){}.f();?

在我尝试结合移动语义学习 C++ 的 const 正确性时,我最终得到了以下代码。

再次:

#include <iostream>
class ThisReference
{
    public:
    void f() const && { std::cout << "f() const &&\n"; }
};

int main()
{
    (const ThisReference){}.f();
}
Run Code Online (Sandbox Code Playgroud)

Godbolt [所有候选方法的时间稍长一些]

该代码使用 GCC 编译,我我明白它的意思,即:

  1. (const ThisReference)定义类型。我希望它是 const,所以我把它放在括号中。
  2. {}执行该类型的初始化;创建一个对象
  3. .f()调用方法
  4. ;结束声明

最终我将该代码放入 Visual Studio 中,但它没有编译。错误信息是

error C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
Run Code Online (Sandbox Code Playgroud)

我对我的代码有两个问题。

  1. 我在这里使用了哪些非标准 GCC 功能以及如何将其关闭?
  2. 我的想法可能有问题。怎么了?

c++ gcc

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

是否有任何语法将矢量硬编码为参数?

例如,我可以将数组硬编码为参数:

void test(pair<string,int> v[],int size){
    for(int i=0;i<size;i++){
        printf("%s %d\n",v[i].first.c_str(),v[i].second);
    }
}

int main(){
    test((pair<string,int>[]){make_pair("a",1),make_pair("b",2)},2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我不需要创建pair v []的临时变量,然后不需要担心temp变量的变量名,如果使用vector,是否有类似的语法:

void test(vector<pair<string,int> > v){
    for(pair<string,int> p : v){
        printf("%s %d\n",p.first.c_str(),p.second);
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ syntax

0
推荐指数
1
解决办法
391
查看次数

如何获取浮动地址与memcpy一起使用?

我正在尝试用float变量的内存地址填充byte/char数组(数组长度是4个字节=指针),但无论我做什么它都会保持浮点值而不是地址:

float f = 20.0f;

memcpy(data, &f, sizeof(data));
Run Code Online (Sandbox Code Playgroud)

调试它:

printf("Array: %#X, %#X, %#X, %#X", data[0], data[1], data[2], data[3]);
Run Code Online (Sandbox Code Playgroud)

...以十六进制格式给出浮点值(20.0):

Array: 0, 0, 0XA0, 0X41
Run Code Online (Sandbox Code Playgroud)

我需要的是float的内存地址.我尝试以某种不同的方式进行铸造/解除引用,但无法使其工作......

c c++ pointers memcpy memory-address

0
推荐指数
1
解决办法
1372
查看次数