3

让我们看下面的代码:

class   const_int                                                                                                                                                                                                    
{                                                                                                                                                                                                                    
public:                                                                                                                                                                                                              
  constexpr const_int(int data) : data_(data) {}                                                                                                                                                                     
  constexpr const_int(const const_int &) = default;                                                                                                                                                                  
  constexpr const_int(const_int &&) = default;                                                                                                                                                                       

private:                                                                                                                                                                                                             
  int   data_;                                                                                                                                                                                                       
};

class   test                                                                                                                                                                                                         
{                                                                                                                                                                                                                    
public:                                                                                                                                                                                                              

  constexpr static const const_int      USER = 42;                                                                                                                                                                

  constexpr static const double         NATIVE = 4.2;                                                                                                                                                                
};

// constexpr const const_int test::USER;

void    pass_by_copie(double)                                                                                                                                                                                        
{                                                                                                                                                                                                                    
}

void    pass_by_copie(const_int)                                                                                                                                                                                     
{                                                                                                                                                                                                                    
}

void    pass_by_const_ref(const const_int&)                                                                                                                                                                          
{                                                                                                                                                                                                                    
}

void    pass_by_rvalue_ref(const_int&&)                                                                                                                                                                              
{                                                                                                                                                                                                                    
}

int     main(void)                                                                                                                                                                                                   
{                                                                                                                                                                                                                    

  pass_by_copie(test::NATIVE);                                                                                                                                                                                       

  pass_by_copie(test::USER);                                                                                                                                                                                         

  pass_by_const_ref(test::USER);                                                                                                                                                                                         

  pass_by_rvalue_ref(const_int(test::USER));                                                                                                                                                                         

  return (0);                                                                                                                                                                                                        
}

以下两行:

pass_by_copie(test::USER);
pass_by_const_ref(test::USER);

在下产生以下错误g++ 4.7

未定义对“test::USER”的引用

我知道没有test::USER. (该行是故意注释的)


我有两个问题:

  1. 为什么需要显式实例test::USER而无需显式实例test::NATIVE来调用函数pass_by_copie

  2. 为什么我可以pass_by_rvalue_ref通过显式创建临时副本来调用,而编译器在调用时test::USER无法(或不想)自己隐式创建相同的副本?pass_by_copietest::USER

谢谢

4

2 回答 2

2

从 C++11 的 3.2 节开始:

名称显示为潜在求值表达式的变量是odr-used的,除非它是一个满足出现在常量表达式中的要求并且立即应用左值到右值转换的对象。

每个程序都应包含该程序中 odr 使用的每个非内联函数或变量的准确定义

所以定义是必需的,因为test::USER它是 odr-used,显然它是 odr-used,因为它不会立即进行左值到右值的转换。这让我感到惊讶,调用pass_by_copie看起来像是执行左值到右值的转换。

于 2012-12-07T19:57:21.250 回答
1

Clang 4.1 给了我这个错误:

Undefined symbols for architecture x86_64:
  "test::USER", referenced from:
      _main in Untitled-gXrry2.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我假设这里发生的事情test::NATIVE可以简单地替换为使用4.2它的值,并且实际上不需要符号。但是test::USER,作为类的实例而不是标量,确实需要一个符号,以便所有引用都test::USER指向同一个对象。鉴于此,您实际上确实需要显式实例。

于 2012-12-07T19:31:10.837 回答