定义中的const值参数是否真的是C++的声明?

Chr*_*ver 3 c++ language-features solaris

这类似于(但不同于)这个问题.

下面是一些简单的测试代码,用于说明我在Sun CC中发现的一些奇怪之处:

//---------------main.cpp
#include "wtc.hpp"

int main(int, char**)
{
  testy t;
  t.lame(99);
  return 0;
}
//--------------wtc.hpp
#ifndef WTC_HPP_INCLUDED
#define WTC_HPP_INCLUDED

class testy
{
public:
  void lame(int );
};

#endif 

//---------------wtc.cpp
#include <iostream>
#include "wtc.hpp"

void testy::lame(const int a)
{
  std::cout << "I was passed " << a << "\n";
}

//---------------makefile
#CXX=CC
CXX =g++
#CXXFLAGS= -g 
CXXFLAGS= -g3 -Wall -Werror

OBJECTS=$(patsubst %.cpp,%.o,$(wildcard *.cpp))

all : $(OBJECTS)
    $(CXX) $(CXXFLAGS) -o $@ $^

.PHONY: clean
clean :
    rm *.o
Run Code Online (Sandbox Code Playgroud)

当使用g ++编译时,它会编译,链接并执行运行时的预期.你也可以添加++ a; 在testy :: lame()中,编译器会抱怨更改只读变量(应该如此).

但是当我使用CC编译时,我收到以下链接器错误:

CC -g   -c -o main.o main.cpp
CC -g   -c -o wtc.o wtc.cpp
CC -g -o all main.o wtc.o
Undefined                       first referenced
 symbol                             in file
void testy::lame(int)               main.o
ld: fatal: Symbol referencing errors. No output written to all
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)

用nm和C++过滤检查目标代码,我发现g ++版本创建了一个testy :: lame(int)符号,而CC创建了testy :: lame(const int),因此链接器错误.

我在Stroustrup的书中查了一下,但是找不到这种技术(并不意味着它不存在!); 那么这真的是一个编译器错误,还是除了Solaris以外的其他地方都可以运行的hack?

Mic*_*urr 24

这看起来像编译器问题CC.C++标准说(在13.1可重载声明中):

仅存在或不存在const和/或volatile的参数声明是等效的.也就是说,在确定声明,定义或调用哪个函数时,将忽略每个参数类型的const和volatile类型说明符.

但是有一些const/ volatile修饰符可以参与重载,不久后标准提到:

仅以这种方式忽略参数类型规范最外层的const和volatile类型说明符; 埋在参数类型规范中的const和volatile类型说明符很重要,可用于区分重载的函数声明.

  • +1,对我来说属于"我理解逻辑,但似乎只是有助于使语言更奇怪"的类别. (4认同)