¿Es el parámetro de valor constante en definición pero no la declaración realmente C ++?

Esto es similar a (pero diferente de)esta pregunt.

Aquí hay un código de prueba simple para ilustrar algunas rarezas que he descubierto con 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

Cuando se compiló con g ++, se compila, enlaza y hace lo que esperaría cuando se ejecute. También puede agregar a ++ a; en testy :: lame () y el compilador se quejará de cambiar una variable de solo lectura (como debería).

Sin embargo, cuando compilo usando CC, aparece el siguiente error de enlace:

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

comprobando el código objeto con nm y C ++ filt, encuentro que la versión g ++ crea un símbolo testy :: lame (int), mientras que CC crea testy :: lame (const int), de ahí el error del enlazador.

Lo busqué en el libro de Stroustrup, pero no puedo encontrar esta técnica mencionada (¡no significa que no esté allí!); Entonces, ¿es esto realmente un error del compilador, o simplemente un truco que funciona en cualquier otro lugar, excepto Solari

Respuestas a la pregunta(7)

Su respuesta a la pregunta